LeetCode189 向右移动K位 数组

力扣第189题介绍如何将数组元素向右移动K位,包括三种不同的解决方案:暴力解法、反转数组法和环形循环法,所有方法都要求使用O(1)的空间复杂度和原地算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣 第189道题

关于数组

题目

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

示例 1:

输入: [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]
示例 2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一

代码
  public class LC189three {
	public void rotate(int[] nums, int k) {
			int x;
	      	for(int i=0;i<k;i++) {
	      		 x=nums[nums.length-1];
	      		 for(int j=nums.length-1 ;j>0 ;j--) {
	      			 nums[j]=nums[j-1];
	      	                           } 
			      nums[0]=x;			
		    }
     }

}

暴力解法,每一次循环将数组往右移一位
往右移K次就执行K次循环。

方法二

代码
public class LC189two {

	public void rotate(int[] nums, int k) {
		k=k%nums.length ;
		reversal(nums,0,nums.length -1);
		reversal(nums,0,k-1);
		reversal(nums,k,nums.length -1);
	}
    public void reversal(int[] a,int start,int end) {
    	while(start<end) {
    		int x=a[end];
    		a[end]=a[start];
    		a[start]=x;
    		start++;
    		end--;
    	}
    	
    }

反转数组,将反转代码执行三次
往右移动K位,则数组尾巴K位的元素会放到数组的前面
其余数组则往后移动K位。

方法3

代码
public class LC189 {

	 public void rotate(int[] nums, int k) {
		 k=k%nums.length;
		if(nums.length == 0) {
		      System.out.println("空");
		}else  {
			  int count=0;
		      for(int i=0;count<nums.length ;i++) {
		    	   int current=i;
	    		   int prev=nums[i];
		    	   do {
		    		   int next=(current+k)%nums.length ;
		    		   int temp=nums[next];
		    		   nums[next]=prev;
		    		   prev=temp;
		    		   current=next;
     //		    做一次do的函数就会有一个数到它移动的位置,记录有数组length的数  全部数就都完成了 用count记录
		    		   count++;
		    		   
     //		     判断一轮是否结束 
		    	   }while(i!=current);		    	  		    	 
		      }			
		}
		for(int q:nums) {
			System.out.print(q);
		}
	 }
		
	public static void main(String[] args) {
	
         LC189 a=new LC189();
          int b[]= new int[10];
          for(int i=0;i<b.length ;i++) {
        	  b[i]=i;
          }
         a.rotate(b, 5);
	} 

环形的循环数组
一轮循环,将第一个元素往后移动K位,第K位元素也往后移动,直到与第一位元素重合。
二轮循环也差不多,第二个元素开始,往后移动K位,第2+K的元素也往后,直到与第二个元素重合。
以此类推。
用count记录移动的元素个数,到了数组的长度就结束循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值