旋转数组

描述:给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

例子:

输入: 
[1,2,3,4,5,6,7]
 和 k = 3
输出: 
[5,6,7,1,2,3,4]

解释:
向右旋转 1 步: 
[7,1,2,3,4,5,6]

向右旋转 2 步: 
[6,7,1,2,3,4,5]
向右旋转 3 步: 
[5,6,7,1,2,3,4]

 解法一:

循环k次,每次先保存数组中的最后一个数,然后将整个数组往后移动一位,最后在将最后一个数赋值给第一个数。

public static void rotate(int[] nums, int k) {
		for(int i = 1; i<=k; i++){
			int temp = nums[nums.length-1];
			for(int j = nums.length-1; j>0; j--){
				nums[j] = nums[j-1];
			}
			nums[0] = temp;
		}
	}

解法二:

既然是旋转数组,那我们要将数组旋转起来,对于[1,2,3,4,5,6,7] ,如果我们将整个数据进行旋转的话,有如下结果:

[7,6,5,4,3,2,1]

假如k=3; 这个位置对于元素4

然后对4的左边和右边包含4各自再进行一次旋转,得到如下结果:

[5,6,7,1,2,3,4] 

因此我们需要根据次数指定旋转的中心位置,然后进行三次旋转即可:

​
public static void rotate1(int[] nums, int k) {
		k %= nums.length; 
		reverse(nums,0,nums.length-1);
		reverse(nums,0,k-1);
		reverse(nums,k,nums.length-1);
	}
private static void reverse(int[] nums, int start, int end){
		while(start < end){
			int temp = nums[start];
			nums[start] = nums[end];
			nums[end] = temp;
			start++;
			end--;
		}
	}

​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值