python中文繁簡體轉換庫zhconv
阿新 • • 發佈:2021-01-08
題目定義:
給定一個數組,將陣列中的元素向右移動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) 的原地演算法。
方式一(三次旋轉):
class Solution { public void rotate(int[] nums, int k) { k = nums.length - (k % nums.length); rotateHelper(nums,0,k - 1); rotateHelper(nums,k ,nums.length - 1); rotateHelper(nums,0,nums.length - 1); } private void rotateHelper(int[] nums,int left,int right){ while(left <= right){ int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; left ++; right --; } } }
方式二(按題意直接for-each):
class Solution { public void rotate(int[] nums, int k) { k = k % nums.length; for(int i = 0; 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; } } }
方式三(環狀替換):
/*
思路:請參考leetcode的下面連結
*/
class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
int count = gcd(k,nums.length);
for(int start = 0; start < count; start ++){
int current = start;
int pre = nums[current];
do{
int next = (current + k) % nums.length;
int temp = nums[next];
nums[next] = pre;
pre = temp;
current = next;
}while(start != current);
}
}
private int gcd(int x, int y){
return y > 0 ? gcd(y, x % y) : x;
}
}
參考:
https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/