網站公司建設 中山分類達人介紹
輪轉數(shù)組
題目描述:
給定一個整數(shù)數(shù)組?
nums
,將數(shù)組中的元素向右輪轉?k
?個位置,其中?k
?是非負數(shù)。
示例1:
輸入: nums = [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:
輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋:?
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]
方法一:重新插入法
通過觀察,我們可以先創(chuàng)建一個新數(shù)組,將原數(shù)組的元素輪轉k位后放入新數(shù)組對應的位置,將所有元組放完后,再將新數(shù)組的元素覆蓋給原數(shù)組即可,但是如果k很大,我們就要輪轉好多次,所以我們可以取模,輪轉最少次數(shù)。
?
代碼實現(xiàn):
public void rotate(int[] nums, int k) {int n = nums.length;int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[(i+k)%n] = nums[i];}for (int i = 0; i < n; i++) {nums[i] = arr[i];}}
方法二:反轉數(shù)組法
此方法是解決這類問題常用的一種方法,比較節(jié)省空間,不用創(chuàng)建新數(shù)組,將數(shù)組反轉三次,即可完成數(shù)組輪轉。
?
代碼實現(xiàn):
public void rotate1(int[] nums, int k) {int n = k % nums.length;reversal(nums,0,nums.length-1);reversal(nums,0,n-1);reversal(nums,n,nums.length-1);}public static void reversal(int[] arr,int l,int r){while (l < r){int temp = arr[l];arr[l] = arr[r];arr[r] = temp;l++;r--;}}