题意:给定一个数组,将该数组的后k位移动到前n-k位之前。(本题在编程珠玑中第二章有讲)

思路:

方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面。

 class Solution {
public:
void rotate(int nums[], int n, int k) {
if( !k || !n || n== || k==n ) return;
k %= n;
vector<int> cha;
cha.reserve(k);
int i;
for(i=n-k; i<n; i++)//装进容器
cha.push_back(nums[i]);
for(i=n-k-; i>=; i--)//移动前n-k位
nums[i+k]=nums[i];
for(i=; i<k; i++)//将容器内k个元素移到前面
nums[i]=cha[i];
}
};

Rotate Array

方法二:将后k位自身旋转,再将前n-k位自身旋转,在将整个数组旋转。例如:[1,2,3,4,5,6,7],第一步[1,2,3,4,7,65],第二步[4,3,2,1,7,6,5],第三步[5,6,7,1,2,3,4]。主要工作就是旋转,

 class Solution {
public:
void rev(int *q,int *p) //将q与p所指向的区间旋转
{
while( q!=p && q!=p+ )
{
*q ^= *p;
*p ^= *q;
*q ^= *p;
q++;
p--;
}
} void rotate(int nums[], int n, int k) {
if( !k || !n || n== || k==n ) return;
k %= n;//这一步很必要
rev(&nums[n-k],&nums[n-]);//转后k个
rev(&nums[],&nums[n-k-]);//转前n-k个
rev(&nums[],&nums[n-]);//转整个
}
};

Rotate Array

方法三:为了省空间,当n%k==0时,就可以用这招了。将最后一位取出来,该位置-k的位置上的值就可以放在最后一位上了,其实就是按周期k,将各个元素一步到达其最终的位置上。例如[1,2,3,4,5,6,7,8,9],k=3,先将9用一个变量存起来,那么6就可以移到9的位置上,3就可以移到6的位置上,9可以移到3的位置上。对于8、5、2也是如此。这样就能完成节省空间的目的了。但是,当n%k不为0时,要注意了,按上面做法移动完之后,最前面的k位并不在其最终位置上,比如[1,2,3,4,5,6,7],k=3,结果却是[7,5,6,1,2,3,4],第一步是7、4、1没错吧?那7就到了1的位置了,第二步是6、3没错吧,那么只是交换了他们的位置。那么7在第1位,6在第3位,5在第2位,这可以想办法解决的。办法是,前k位中的前(n%k)个元素得接在后面k-(n%k)位的后面,又需要进行一次旋转,太麻烦了,如果这次k%(n%k)又不为0,那么还有得继续!我用的方法是对这前k位直接套用上面第2种方法。速度奇慢!

 class Solution {
public:
void rev(int *q,int *p)
{
while( q!=p && q!=p+ )
{
*q ^= *p;
*p ^= *q;
*q ^= *p;
q++;
p--;
}
} void rotate(int nums[], int n, int k) {
if( !k || !n || n== || k==n ) return;
k %= n;
int temp, i, j;
for(i=; i<=k; i++)
{
temp = nums[n-i];
cout<<temp<<endl;
for(j=n-i-k; j>=; j-=k)
{
nums[j+k] = nums[j];
cout<<nums[j+k]<<endl;
}
nums[j+k] = temp;
}
temp=n%k;
//套用第2种方法
rev(&nums[],&nums[temp-]);
rev(&nums[temp],&nums[k-]);
rev(&nums[],&nums[k-]);
}
};

Rotate Array

LeetCode Rotate Array 翻转数组的更多相关文章

  1. [LeetCode] Rotate Array 旋转数组

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  2. C++ STL@ list 应用 (leetcode: Rotate Array)

    STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...

  3. 2016.5.16——leetcode:Rotate Array,Factorial Trailing Zeroe

    Rotate Array 本题目收获: 题目: Rotate an array of n elements to the right by k steps. For example, with n = ...

  4. Python3解leetcode Rotate Array

    问题描述: Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: ...

  5. [LeetCode] 189. Rotate Array 旋转数组

    Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...

  6. Rotate Array 旋转数组 JS 版本解法

    Given an array, rotate the array to the right by k steps, where k is non-negative. 给定一个数组,并且给定一个非负数的 ...

  7. [LeetCode] Patching Array 补丁数组

    Given a sorted positive integer array nums and an integer n, add/patch elements to the array such th ...

  8. [LeetCode] Contiguous Array 邻近数组

    Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...

  9. 189 Rotate Array 旋转数组

    将包含 n 个元素的数组向右旋转 k 步.例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...

随机推荐

  1. npm ERR! Unexpected token in JSON at position 0 while parsing near '<HTML> 解决办法

    npm ERR! Unexpected token in JSON at position 0 while parsing near '<HTML> npm ERR! <!--/// ...

  2. html5表单及新增的改良元素

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 51nod 1154【DP】

    区间DP大暴力吧?GG. dp[ i ] 为字符至 i 的最少数量. 如果[Left , Right]是回文串, dp[Right] = min(dp[ Right ] , dp[Left-1] + ...

  4. CodeForces 124C【连通块】

    思路: a素数->b合数 c素数->b合数 a,c属于一类 so,预处理相同的,并且计数.1000怎么搞都无压力: 我这里也预处理了字母个数,从集合大的枚举下来,每次拿字母个数最多的去匹配 ...

  5. Glusterfs冗余镜像(AFR)修复原理以及脑裂分析

    研究Glusterfs半年多了,通过实际操作以及源代码分析,对它有了越来越深的了解,由衷的赞叹Gluster的整体架构.今天时间不早了,想写点关于Glusterfs的冗余镜像产生脑裂的原因. 首先,简 ...

  6. 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)

    传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...

  7. JSONObject,JSONArray,String,Map间的互转

    引言      在平常的Web项目开发过程中,json和String.map是最常用的类型和返回结果集,其中也经常会涉及到之间的各种相互转换,下边就总结一下: 1.String转JSONObject ...

  8. IDEA调试方法总结及各种Step的区别

    1.打断点 IDEA 添加断点的方式还是比较简单的,我们可以直接在某一行的代码行号后点击鼠标左键进行添加 2.启动调试 如果我们想要调试我们的程序,那我们必须以DEBUG的形式启动我们的程序,以DEB ...

  9. Idea提示没有符号类错误解决

    将提示没有符号类的文件打开,右键单独编译一次,再重新打包即可解决

  10. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...