数组向左移K位

例 char str[ ] = a b c d e f g h i j k  ;向左移K位:假设K=3

方法:

1:第K位(包括第K位)之前的逆序,之后的逆序 

 a b c | d e f g h i j k  各自逆序得到:c b a  k j i h g f e d 

2:总体合一块逆序:

c b a  k j i h g f e d  逆序得到:d e f g h i j k     a b c   

### 实现数组元素向左 在 Java 中实现数组元素向左可以通过多种方法完成。一种常见的方式是利用额外的空间来存储临时副本,另一种更高效的方法是在原地进行旋转。 #### 方法一:使用额外空间 这种方法简单直观,创建一个新的数组并将原始数组中的元素按新的顺序放入其中: ```java public class ArrayShift { public static int[] shiftLeft(int[] array, int k) { if (array == null || array.length == 0) return new int[0]; int n = array.length; k %= n; // 处理k大于n的情况 if (k < 0) { k += n; // 将负数转换成正数偏量 } int[] result = new int[n]; for (int i = 0; i < n; ++i) { result[(i + n - k) % n] = array[i]; } return result; } } ``` 此代码片段展示了如何通过构建一个新数组并重新排列索引来达到左的效果[^1]。 #### 方法二:反转三次法(不占用额外空间) 该技术基于观察到的事实——当我们将整个序列反序两次再局部翻转一次可以得到所需的结果。具体步骤如下: 1. 反转前 `k` 个元素; 2. 反转剩下的 `(length-k)` 个元素; 3. 最后再整体反转一遍整个数组。 ```java public class InPlaceArrayRotation { private static void reverse(int[] arr, int start, int end){ while(start<end){ swap(arr,start++,end--); } } private static void swap(int[] arr,int a ,int b){ int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } public static void rotateToLeftInPlace(int[] nums, int d) { int n = nums.length; d%=n; if(d==0||d==n)return ; reverse(nums, 0,d-1); reverse(nums, d,n-1); reverse(nums, 0,n-1); } } ``` 上述代码实现了无需额外内存开销的情况下对数组进行了有效的左操作。 这两种方式各有优劣,在实际应用中可以根据具体情况选择合适的方法。对于较小规模的数据集或者性能不是特别敏感的应用场景下可以直接采用第一种方案;而对于大规模数据处理,则建议考虑第二种优化后的算法以节省资源消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值