C#解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 [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的更多相关文章
- [LeetCode] 189. Rotate Array 旋转数组
Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...
- 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 ...
- 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 ...
- 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 ...
- 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,.. ...
- <LeetCode OJ> 189. Rotate Array
189. Rotate Array Total Accepted: 55073 Total Submissions: 278176 Difficulty: Easy Rotate an array o ...
- 189. Rotate Array - LeetCode
Question 189. Rotate Array Solution 题目大意:数组中最后一个元素移到第一个,称动k次 思路:用笨方法,再复制一个数组 Java实现: public void rot ...
- 189. Rotate Array【easy】
189. Rotate Array[easy] Rotate an array of n elements to the right by k steps. For example, with n = ...
- 【LeetCode】Rotate Array
Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = ...
随机推荐
- utf8_general utf8_general utf8_bin区别
对与general来说 ß = s 是为true的 但是对于unicode来说 ß = ss 才是为true的, 其实他们的差别主要在德语和法语上,所以对于我们中国人来说,一般使用general,因为 ...
- Bow模型(解释的很好)
Bag-of-words model (BoW model) 最早出现在NLP和IR领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达一段文字或一个文档. 近年来, BoW模 ...
- Web工程软件升级之数据库升级(二)
升级前检查 1. 用户是否存在 awk -F: '{if($1 == "xxx") print $1}' /ect/passwd 用户名 awk -F: '{if($1 == &q ...
- 【Java】Java6 WebService的发布
WebService服务发布往往比较混乱,Axis2的发布形式与XFire发布方式差别很大,而Java6 Web服务的发布与Axis2.XFire的Web服务的发布方式也有着天壤之别,它们之间没有经验 ...
- Hibernate 配置详解(5)
9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...
- AlgorithmsI Programming Assignment 1: Percolation
3种版本的答案,第一种使用virtual top and bottom site, 但有backwash的问题,解决这个问题有两种方法: 1. 使用2个WQUUF, 但会增加memory. One f ...
- Light OJ 1021 - Painful Bases(状态压缩DP)
题目大意: 给你一个base 进制的数字,把这个数字的每一位进行全排列,问有多少个数字是可以整除k的. 题目解析: #include<cstdio> #include<cstring ...
- Remove Linked List Elements——LeetCode
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- Nodejs in Visual Studio Code 08.IIS
1.开始 本文部分内容均转载自文章: http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWi ...
- 滑雪 (搜索)(dp)(贪心)
以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...