1. 程式人生 > >LeetCode-旋轉陣列

LeetCode-旋轉陣列

旋轉陣列

將包含 n 個元素的陣列向右旋轉 步。

例如,如果  n = 7 ,  k = 3,給定陣列  [1,2,3,4,5,6,7]  ,向右旋轉後的結果為 [5,6,7,1,2,3,4]

注意:

儘可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。

感覺這個題目還是可以的。

首先要明白什麼是一維陣列右旋轉幾(當然肯定會有對應向左旋轉幾步嘍,說不定也有向上或者向下旋轉啦,害羞呵呵自己google了),你以為是像上學時候那樣軍訓時原地旋轉嗎?其實我在很久以前剛觸到的時候就是這麼想的,我厲害吧。

碼子可以說明一切:

  1. [1,2,3,4,5,6,7]//初始陣列
  2. //向右旋轉1步
  3. [7,1,2,3,4,5,6]//向右旋轉1步之後的陣列
  4. //再向右旋轉1步,相對一最開始的陣列就是向右旋轉2步
  5. [6,7,1,2,3,4,5]//向右旋轉2步之後的陣列
  6. //把最原始的陣列向左旋轉1步
  7. [2,3,4,5,6,7,1]//這就是向左旋轉一步之後的陣列

應該看明白了吧,就拿向右旋轉1步來說:首先向拿旋轉的陣列要有一個初始的陣列,是相對於一個數組來說向左或者向右的;向右旋轉1步就是說把初始陣列的最高位上的數字放置在陣列的最低位置,讓後其他位置上的數字都把自身的位置提高1位。就這麼簡單什麼向左旋轉都一個道理(程式設計師都愛說一些高大上的名詞。聽起來很牛逼,說穿了哎。。。)

其實這就很容易想到第一種方案:

  1. privatestaticint[] Rotate2(int[] nums, 
    int k)//k就是指旋轉幾步
  2.         {  
  3.             int length = nums.Length;  
  4.             while (k > 0)//迴圈幾次就看k是多少
  5.             {  
  6.                 int t = 0;  
  7.                 t = nums[length - 1];//這是獲取陣列最高位置上的數字
  8.                 for (int j = length - 2; j >= 0; j--)//從倒數第二個數字開始,倒敘迴圈。迴圈主要目的就是把其他數字位置都擡高一位
  9.                 {  
  10.                     nums[j + 1] = nums[j];  
  11.                 }  
  12.                 nums[0] = t;//擡高玩其他的,就可以直接把最高位上的數字賦值到0號位上了
  13.                 k--;//完成一個迴圈
  14.             }  
  15.             returnnull;  
  16.         }  

其實上面每一次迴圈就三步:第一獲取最高位的數字,第二把其他位上的數字都擡高一位,第三把最初獲得最高位的數字賦值到最低位置上。

第二種方法就比較取巧了:

  1. privatestaticint[] Rotate1(int[] nums, int k)  
  2.        {  
  3.            int[] result = newint[nums.Length];//根據nums陣列長度生成和其一樣長度的陣列
  4.            for (int i = 0; i < nums.Length; i++)  
  5.            {  
  6.                result[(i + k) % nums.Length] = nums[i];//這裡用到了取餘,也是這個方法的核心
  7.            }  
  8.            return result;  
  9.        }  

為什麼用取餘上個例子:

  1. ///3元素在陣列中的2位置上,(2+3) % 7 = 5
  2.    ///5元素在陣列中的4位置上,(4+3) % 7 = 0
  3.    ///6元素在陣列中的5位置上,(5+3) % 7 = 1
  4.    ///7元素在陣列中的6位置上,(6+3) % 7 = 2

長度為7的陣列,向右旋轉3步,數字的位置加3之後大於7的都要再從0號位置重新開始計算剩餘的步子。這點特性就可以很好的用到求餘。

應用一下:

  1. staticint[] nums = newint[] { 1, 2, 3, 4, 5, 6, 7 };  
  2.        staticvoid Main(string[] args)  
  3.        {  
  4.            //Rotate1(nums, 3);
  5.            Rotate2(nums, 3);  
  6.        }  

這種型別的題目還有很多種解法(自己可以google嘍),以後願意的話我再補充。

用四種方法實現了將陣列元素迴圈右移k個位置,相關的解釋作為註釋放在程式碼裡面了。

  1. package movearrayelement;  
  2. import java.util.BitSet;  
  3. publicclass MoveArrayElement {  
  4.     /** 
  5.      * 每次把陣列中所有元素移動一個位置,移動k輪 
  6.      * @param array 
  7.      * @param k 
  8.      */
  9.     publicstaticvoid moveArrayElement(int[] array, int k) {  
  10.         int length = array.length;  
  11.         // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
  12.         int newk = k % length;  
  13.         int temp = 0;  
  14.         for(int i = 0; i < newk; i++) {  
  15.             temp = array[length - 1];  
  16.             for(int j = length - 2; j >= 0; j--) {  
  17.                 array[j+1]=array[j];  
  18.             }  
  19.             array[0]=temp;  
  20.         }  
  21.     }  
  22.     /** 
  23.      * 開闢一個新陣列,把舊陣列中的元素直接放在新陣列中正確的位置 
  24.      * @param array 
  25.      * @param k 
  26.      * @return 
  27.      */
  28.     publicstaticint[] moveArrayElement1(int[] array, int k) {  
  29.         int length = array.length;  
  30.         // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
  31.         int newk = k % length;  
  32.         int[] newArray = newint[length];  
  33.         // 重複length次把元素從舊位置移到新位置
  34.         for(int i = 0; i < length; i++) {  
  35.             // 求出元素新的位置
  36.             int newPosition = (i + newk) % length;  
  37.             newArray[newPosition] = array[i];  
  38.         }  
  39.         return newArray;  
  40.     }  
  41.     /** 
  42.      * 1.把一個元素放在一個正確的位置,再把被佔位置的元素放到它應該在的正確的位置,一直 
  43.      * 重複下去,直到陣列的所有元素都放在了正確的位置; 
  44.      * 2.但是必須考慮環形的情況,比如十個元素的陣列,右移5個位置,這時,位置0的元素應該放在位置5, 
  45.      * 位置5的元素應該放在位置0,這樣,完全通過1的迭代就不能得到 正確的結果 
  46.      * @param array 
  47.      * @param k 
  48.      */
  49.     publicstaticvoid moveArrayElement2(int[] array, int k) {  
  50.         int length = array.length;  
  51.         BitSet bitSet = new BitSet(length);  
  52.         boolean flag = false;  
  53.         // 保證最多隻移動count=length次位置
  54.         int count = 0;  
  55.         for(int j = 0; j < length; j++) {  
  56.             if (flag) {  
  57.                 break;  
  58.             }  
  59.             if (!bitSet.get(j)) {  
  60.                 // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
  61.                 int newk = k % length;  
  62.                 // 舊位置
  63.                 int oldPosition = j;  
  64.                 // 儲存舊位置的值
  65.                 int oldValue = array[oldPosition];  
  66.                 // 臨時值
  67.                 int temp = 0;  
  68.                 // 重複length次把元素從舊位置移到新位置
  69.                 for(int i = 0; i < length; i++) {  
  70.                     // 求出元素新的位置
  71.                     int newPosition = (oldPosition + newk) % length;  
  72.                     // 如果新位置已經放置了對得值,就不要往新位置再次放入值了
  73.                     if (bitSet.get(newPosition)) {  
  74.                         break;  
  75.                     }  
  76.                     // 臨時儲存新位置(也就是新的舊位置)的值
  77.                     temp = array[newPosition];  
  78.                     // 移動元素到新位置
  79.                     array[newPosition] = oldValue;  
  80.                     

    相關推薦

    Leetcode 旋轉陣列(c++)

    給定一個數組,將陣列中的元素向右移動 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

    leetcode---旋轉陣列

    題目說明 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右

    LeetCode-旋轉陣列

    旋轉陣列將包含 n 個元素的陣列向右旋轉 k 步。例如,如果  n = 7 ,  k = 3,給定陣列  [1,2,3,4,5,6,7]  ,向右旋轉後的結果為 [5,6,7,1,2,3,4]。注意:儘可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。感覺這個題目

    LeetCode——旋轉陣列

    問題描述:給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。解法一:將下標為i的元素放在下標i+k處,再將下標i+k處的元素放置在正確位置,以此類推(AC),時間複雜度:O(n),空間複雜度:O(1),程式碼如下:private static void R

    (LeetCode)旋轉陣列

    原體描述如下: 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 rotate

    Leetcode演算法——33、查詢有序旋轉陣列

    給定一個數組,這個陣列是由一個升序陣列進行左旋或右旋若干次得到的。 比如,[0,1,2,4,5,6,7] 可能會變為 [4,5,6,7,0,1,2] 給定一個目標值,去陣列中查詢這個值。如果找到,則返回索引,否則返回-1。 可以假設陣列中沒有重複值。 示例: Exampl

    LeetCode演算法題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]

    LeetCode 189.Rotate Array (旋轉陣列)

    題目描述: 給定一個數組,將陣列中的元素向右移動 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,

    LeetCode 189.旋轉陣列

    void rotate(int* nums, int numsSize, int k) { int i,j,b; for (i = 0; i < k; i++) { b=nums[numsSize-1]; for (j = numsSize-2; j >= 0; j

    刷爆LeetCode旋轉陣列

    旋轉陣列 給定一個數組,將陣列中的元素向右移動 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

    LeetCode使用Python實現旋轉陣列

    需求: 給定一個數組,將陣列中的元素向右移動 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,

    LeetCode[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 步

    LeetCode旋轉陣列

    給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1

    leetcode】#陣列【Python】48. Rotate Image 旋轉影象

    連結: 題目: 給定一個 n × n 的二維矩陣表示一個影象。 將影象順時針旋轉 90 度。 說明: 你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影象。 示

    LeetCode-面試演算法經典-Java實現】【153-Find Minimum in Rotated Sorted Array(找旋轉陣列中的最小數字)】

    原題   Suppose a sorted array is rotated at some pivot unknown to you beforehand.   (i.e., 0

    LeetCode--初級演算法--陣列篇-旋轉陣列

    題目 給定一個數組,將陣列中的元素向右移動 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,

    LeetCode-探索-初級-陣列-旋轉陣列-java

      旋轉陣列 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,

    LeetCode 153. Find Minimum in Rotated Sorted Array(旋轉陣列查詢)

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find t

    LeetCode(初級演算法)陣列篇---旋轉陣列

    題目 將包含 n 個元素的陣列向右旋轉 k 步。 例如,如果 n = 7 , k = 3,給定陣列 [1,2,3,4,5,6,7] ,向右旋轉後的結果為 [5,6,7,1,2,3,4]。 注意: 儘可能找到更多的解決方案,這裡最少有三種不同的方法

    LeetCode】Rotate Array 旋轉陣列

    題目 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]