Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

我的代码,运行时间488ms:

public class Solution {
public void Rotate(int[] nums, int k) {
int[] zong=new int[nums.Length+k];
int j=;
k=k%nums.Length;
int[] temp=new int[k];
if (k!=)
{
for(int i=nums.Length-k;i<nums.Length;i++)
{
temp[j]=nums[i];
j++;
}
temp.CopyTo(zong, ); //将temp数组拷贝到zong数组中,其实位置为zong[0]
nums.CopyTo(zong, temp.Length);//将nums数组拷贝到zong数组中,其实位置为zong[temp.Length]
Array.ConstrainedCopy(zong, , nums, ,nums.Length ); //将总的数组拷贝到nums数组中,其中zong的起始位置为zong[0],nums的起始位置为nums[0],拷贝的长度为nums.Length
}
}
}

非常可惜的是,虽然题目要求是用3中做法做出来,但是我只能想出来一种。

本题注意点:

1 可能出现k>nums.Length的情况,此时k%nums.Length即可排除一个轮换周期

2 刚开始用了两个嵌套for循环,可是提示time error,可见这种模式太耗时间,应该少用

在Disacuss中见到了一个非常简洁的算法:

public class Solution {
public void Rotate(int[] nums, int k) {
k=k%nums.Length;
int[] numsCopy=new int[nums.Length];
if(k!=)
{
for(int i=;i<nums.Length;i++)
{
numsCopy[i]=nums[i];
} for(int i=;i<nums.Length;i++)
{
nums[(i+k)%nums.Length]=numsCopy[i];
}
}
}
}

其中nums[(i+k)%nums.Length]=numsCopy[i];这句非常巧妙的利用取余运算!

看了上面的代码,我意识到数组的传值需要用一个for循环,不应该直接传地址。因此将我原来的代码稍作修改:将

 Array.ConstrainedCopy(zong, 0, nums,0 ,nums.Length );修改为一个for循环:
 for (int i=;i<nums.Length;i++)
{
nums[i]=zong[i];
}

这样也可以Accepted!

这里还有一个我至今没有看懂的方法,先放在这里,期待以后可以看懂:

public class Solution {
public void Rotate(int[] nums, int k) {
int sz,n,temp;
sz=n=nums.Length;
k%=n;
if(n< || k<) return;
for(int i=k;n>;++i)
{
int j=i, prev=nums[(i-k)%k];
while(n-->)
{
//Interlocked.Exchange(prev,nums[j]);
temp=nums[j];
nums[j]=prev;
prev=temp;
j=(j+k)%sz;
if(j==i) break;
}
}
}
}

很高兴 今天把它看懂了,这里就贴上源代码以及我的理解:

public class Solution {
public void Rotate(int[] nums, int k) {
int sz,n,temp;
sz=n=nums.Length;
k%=n;
if(n< || k<) return;
for(int i=k;n>;++i)
{
int j=i, prev=nums[(i-k)%k];
while(n-->)
{
//Interlocked.Exchange(prev,nums[j]);
temp=nums[j];
nums[j]=prev;
prev=temp;
j=(j+k)%sz; //如果把这个数组看成一个循环列表,这样每进行完一次j=(j+k)%sz,指针就会前移k格,将该位置的数更新
if(j==i) break; //如果某一次前进k格又到了初始位置,此时在循环的话和上次循环的效果一样,所以应该跳出循环,同时利用下一个位置的数字作为初始的值,进行第二次循环,一直如此往复,知道所有的值都更新完成。由于条件限制,一共只会自行n次,每次更新一个数字,正好全部更新完毕
}
}
}
}

C#解leetcode 189. Rotate Array的更多相关文章

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

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

  2. LeetCode 189. Rotate Array (旋转数组)

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

  3. Java for LeetCode 189 Rotate Array

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

  4. Java [Leetcode 189]Rotate Array

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

  5. Leetcode 189 Rotate Array stl

    题意:将数组旋转k次,如将数组[1,2,3,4,5]旋转1次得到[2,3,4,5,1],将数组[1,2,3,4,5]旋转2次得到[3,4,5,1,2]..... 本质是将数组分成两部分a1,a2,.. ...

  6. &lt;LeetCode OJ&gt; 189. Rotate Array

    189. Rotate Array Total Accepted: 55073 Total Submissions: 278176 Difficulty: Easy Rotate an array o ...

  7. 189. Rotate Array - LeetCode

    Question 189. Rotate Array Solution 题目大意:数组中最后一个元素移到第一个,称动k次 思路:用笨方法,再复制一个数组 Java实现: public void rot ...

  8. 189. Rotate Array【easy】

    189. Rotate Array[easy] Rotate an array of n elements to the right by k steps. For example, with n = ...

  9. 【LeetCode】Rotate Array

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

随机推荐

  1. php实现base64编码

    工作需要,想弄一个加密的串,就想仿照base64的编码方式,写一个加密的方法,所以就有了下面这个用php实现的base64的代码 <?php /** * Base64 编码/解码 * @auth ...

  2. 【转】Spring注解详解

    http://blog.csdn.net/xyh820/article/details/7303330/ 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类 ...

  3. phalapi

    public为程序入口 Demo和MyApp为具体的实现 public为多入口 demo和myapp都是入口,但是进入后即又为单入口 list为接口文档,是自动解析程序里的注释自动生成的文档 框架执行 ...

  4. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

  5. Java 可视化垃圾回收

    基础 当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数. 这是件好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的.在这方面,语言的运行 ...

  6. Gnome Tetravex

    zoj1008:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目意思是有一个游戏,即给出一个图,该图是由n*n个 ...

  7. GPIO模拟串口注意是事项

    GPIO模拟串口需要注意的事项如下:(程序见我的博客第一篇) 1.由于串口是异步通信,则串口发送必须满足宽度要求. (1)假设串口的波特率是9600bps(1s传输9600个bit),则传输1bit需 ...

  8. [转]关于Icon,Image,ImageIcon的简单的对比参考

    转自:http://blog.csdn.net/bcmissrain/article/details/7190886 其实就算是现在,我还是有不少地方概念模糊,但是下面的内容是是没有什么问题的.稍微介 ...

  9. bzoj2006

    论将区间和转化为前缀和的重要性这题一旦转化为前缀和就非常明了了一段区间[l,r]的美妙程度就等于s[r]-s[l-1]对于这种无法计算出所有方案而取前k大的题目,我们一般分类别然后利用类别内的单调性用 ...

  10. selenuim ide回放时出现的问题

    [error] Unexpected Exception: fileName -> chrome://selenium-ide/content/selenium-core/scripts/htm ...