leetcode旋转数组 c语言,[原创]LeetCode Rotate Array(旋转数组)

otate 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.

旋转n个元素向右移k步的阵列

例如:n = 7,k = 3. 数组[1, 2, 3, 4, 5, 6, 7]旋转以后得到的数组是[5,6,7,1,2,3,4]

提示:尝试尽可能多的方法来实现,至少有三种方法可以解决这个问题。

假设:[1,2,3,4,5,6,7]当k=3时,分界点是5。

思路一:

从5开始,逐个将5以后的数移动到指定位置。

第一步得到[5, 1, 2, 3, 4, 6, 7].

第二步得到[5, 6, 1, 2, 3, 4, 7]

第三步得到[5, 6, , 71, 2, 3, 4](即为所得)

具体实现代码:

void rotate(int nums[], int n, int k) {

int temp;

for (int step = 0; step 

temp = nums[n-1];

for (int i = n-1; i > 0; --i)

{

nums[i] = nums[i-1];

}

nums[0] = temp;

}

}

提交结果,当数据规模大时,超时。

思路二(算法改进):

先将5以前的数据翻转得到的数组是[4,3,2,1,5,6,7]

再将5及以后的数据翻转得到的数组是[4,3,2,1,7,6,5]

再将整个数组翻转即得到[5,6,7,1,2,3,4]. (即为所求)

具体实现代码:

public static void rotate(int[] nums, int k) {

int length = nums.length;

k = k % length;

if(length == 1)

return;

if(k == 0)

return;

reversal(nums, 0, length - k - 1);

reversal(nums, length -k, length - 1);

reversal(nums, 0, length - 1);

}

public static void reversal(int[] nums, int i, int j){

int t = 0;

while(i = 0){

t       = nums[i];

nums[i] = nums[j];

nums[j] = t;

i++;

j--;

}

}

提交结果:

81498575_1.png

81498575_2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值