將數組中的所有元素依次循環右移k個位置

比如說數組{ 1, 2, 3, 4, 5 },右移2位,得到的結果應該是{4,5,1,2,3}

方法1:

/// 數據arr右移k位
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="k"></param>
        /// <returns></returns>
        public static int[] ArrayDisplacement(int[] arr, int k)
        {
            // 定義一個和原數組長度相同的新數組
            int[] newarr = new int[arr.Length];

            // 右移k位和右移k+arr.Length位是一樣的
            k = k % arr.Length;

            // 數組內的元素全部右移k位
            for (int i = 0; i < arr.Length; i++)
            {
                // 當前元素右移k位尚未超出數組長度時,賦值給新數組i+k位,否則賦值給i + k - arr.Length
                if (i + k < arr.Length)
                {
                    newarr[i + k] = arr[i];
                }
                else
                {
                    newarr[i + k - arr.Length] = arr[i];
                }
            }

            return newarr;
        }

方法2:
數組右移之後和原來相比,可以將原數組從第k位分作兩部分,兩部分之間位置調換,就是右移k位了。

/// 數組反轉(從第下標m開始至下標n)
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="m"></param>
        /// <param name="n"></param>
        public static void Reverse(ref int[] arr, int m, int n)
        {
            for (; m < n; m++, n--)
            {
                int t = arr[m];
                arr[m] = arr[n];
                arr[n] = t;
            }
        }
int[] arr = { 1, 2, 3, 4, 5 };
int k=2%arr.Length;
Reverse(ref arr, 0, k);
        Reverse(ref arr, k+1, arr.Length-1);
        Reverse(ref arr, 0, arr.Length - 1);

這樣就能實現數組所有元素右移了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章