摘要:解法一假设数组为先把换到的位置,把拿着换到的位置,把拿着换到的位置。。。停止条件姑且假设为当置换的数回到数组的首位。不过换一个栗子上述方法就不通了,比如数组为换一轮发现结果是。
题目: 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].
两种解法:
第一种是原地swap,记录下被挤掉的数再接着swap,需要一些时间举栗子探索规律;
第二种是倒三次的方法,如果之前没有准备过,面试中不太可能自己想出来。
解法一(12%):假设数组为[1,3,5,7,9], k = 2 :
先把1换到5的位置,把5拿着换到9的位置,把9拿着换到3的位置。。。最后7到了1的位置就换完了,貌似计划通啊。
停止条件姑且假设为当置换的数回到数组的首位。
不过换一个栗子上述方法就不通了,比如数组为[1,3,5,7,9,11], k = 2, 换一轮发现结果是[9,3,1,7,5,11]。
这里要从3开始重复一遍上述方法,所以要再套一个loop,i = 0, 停止条件为 最大公约数(数组长度,k)。这样所有的情况都能cover了。
public static void rotate(int[] nums, int k) { if(nums == null || nums.length <= 1) return; k = k%nums.length; int prev = 0; int next = 0; int maxComm = maxCommonDivisor(k,nums.length); for(int i = 0; i < maxComm;i++){ prev = nums[i]; int j = i+k; j %= nums.length; while(j != i){ next = nums[j]; nums[j] = prev; prev = next; j+=k; j%=nums.length; } nums[j] = prev; } return; } private static int maxCommonDivisor(int m, int n){ while (m % n != 0) { int temp = m % n; m = n; n = temp; } return n; }解法二(12%):
巧妙的reverse三次:
第一次reverse整个数组;
第二次reverse子数组(0,k-1);
第三次reverse子数组(k,length-1)
reverse的函数都是一样的,所以可以写一个helper。
public static void rotate(int[] nums,int k) { if(nums == null || nums.length <= 1) return; k %=nums.length; if(k == 0) return; helper(nums,0,nums.length-1); helper(nums,0,k-1); helper(nums,k,nums.length-1); } public static void helper(int[] nums,int start,int end) { for(int i = start; i <= (end+start)/2;i++) { int temp = nums[end+start-i]; nums[end+start-i] = nums[i]; nums[i] = temp; } }
最后贴一下最快的code(98%):
public void rotate(int[] nums, int k) { int n = nums.length; k = k%n; int[] temp = Arrays.copyOfRange(nums, 0, n-k); System.arraycopy(nums, n-k, nums, 0, k); System.arraycopy(temp, 0, nums, k, n-k); }
Reference: 0ms 5-line java
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66064.html
摘要:公众号爱写给定一个数组,将数组中的元素向右移动个位置,其中是非负数。只要截取输入的后位的数组与输入的剩余长度的数组,即为所求但是题目要求使用空间复杂度为的原地算法。利用切片切片组成新数组 公众号:爱写bug(ID:icodebugs) 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 Given an array, rotate the array to the ...
摘要:公众号爱写给定一个数组,将数组中的元素向右移动个位置,其中是非负数。只要截取输入的后位的数组与输入的剩余长度的数组,即为所求但是题目要求使用空间复杂度为的原地算法。利用切片切片组成新数组 公众号:爱写bug(ID:icodebugs) 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 Given an array, rotate the array to the ...
摘要:问题描述解题思路使用数组自带的方法和方法把数组最后一个取出来加入到头部。使用数组的方法得到后个数,再用方法删去后个数,最后用方法把得到的后个数添加到数组前面。 问题描述: 189.Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, t...
摘要:给定一个链表,旋转链表,将链表每个节点向右移动个位置,其中是非负数。按上述思路解,与旋转数组那道题大同小异,来介绍另一种很简单高效的方法。只需在第个节点之后切断,首尾连接即可。另外可能大于链表长度,应当做求余运算。 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 Given a linked list, rotate the list to the ...
摘要:自己没事刷的一些的题目,若有更好的解法,希望能够一起探讨项目地址 自己没事刷的一些LeetCode的题目,若有更好的解法,希望能够一起探讨 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...
阅读 3766·2021-11-11 11:02
阅读 3495·2021-10-11 10:57
阅读 3607·2021-09-22 16:00
阅读 1843·2021-09-02 15:15
阅读 1321·2019-08-30 15:56
阅读 1004·2019-08-30 15:54
阅读 2731·2019-08-30 12:43
阅读 3538·2019-08-29 16:06