将数组中的所有元素依次循环右移k个位置

本文详细介绍了数组右移的两种方法,并通过实例演示如何实现数组元素的右移操作,包括具体步骤和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比如说数组{ 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);

这样就能实现数组所有元素右移了

### 实现数组元素循环右移N 对于实现数组元素循环右移 N 的问题,存在多种方法可以完成这一目标。下面提供几种不同编程语言下的解决方案。 #### Java 实现 在 Java 中可以通过创建一个新的临时数组来保存原数组最后 N 个元素,在新数组中先填充这些元素后再依次填入前面的部分[^1]: ```java public static void shiftRight(int[] array, int n) { if (array == null || array.length == 0) return; int length = array.length; n %= length; int[] result = new int[length]; System.arraycopy(array, length - n, result, 0, n); System.arraycopy(array, 0, result, n, length - n); System.arraycopy(result, 0, array, 0, length); } ``` #### C 语言实现单次右移并扩展至多次 针对 C 语言环境,可基于单步右移函数构建多步右移逻辑。这里给出一个简单的例子展示如何利用 `rotateRight` 函数连续调用达到目的[^2]: ```c void rotateRightNTimes(int arr[], int n, int times) { for (int j = 0; j < times % n; ++j) { int temp = arr[n-1]; for (int i=n-1; i>0; --i){ arr[i]=arr[i-1]; } arr[0]=temp; } } ``` 然而这种方法效率较低下,特别是当需要执行大量旋转时性能会受到影响。因此推荐采用更高效的算法如反转法[^5]。 #### 使用反转法优化C语言版本 一种更加高效的方法是应用三重翻转策略:首先整体翻转整个数组;接着分别对前 K 和后 L=total-K 部分单独进行翻转即可得到最终结果。此方法的时间复杂度仅为O(n),而且只需要常数级别的额外空间开销[^4]。 ```c // 辅助函数用于交换两个整数值 void swap(int* a, int* b) { int t=*a; *a=*b; *b=t; } // 反转指定范围内的数组元素 void reverseArray(int arr[], int start, int end) { while(start<end){ swap(&arr[start],&arr[end]); start++; end--; } } // 主要功能:将给定大小为n的数组按k向右轮转 void efficientRotate(int arr[], int n, int k) { k%=n; // 处理大于数组长度的情况 reverseArray(arr, 0, n-1); // 整体反转 reverseArray(arr, 0, k-1); // 前半部分反转 reverseArray(arr, k, n-1); // 后半部分反转 } ``` 上述三种方案展示了不同的思路和技术手段去解决问题,其中第三种方式因其较高的时间与空间利用率而被广泛采纳作为标准做法之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值