当前位置:   article > 正文

数组:如何把一个数组循环右移K位_数组右移k位

数组右移k位

问题描述:

假设要把数组12345678右移2位,变为78123456。

分析:

方法一:

比较移位前后数组序列的形式,不难看出,其中有两段序列的顺序是不变的,即就是 78 和 123456, 可以把这两段看做两个整体,右移k位就是把数组的两部分交换一下。时间复杂度为O(n)

步骤:

1)逆序数组子序列123456,数组序列的形式为65432178

2)逆序数组子序列78, 数组序列的形式变为65432187

3)全部逆序, 数组序列的形式为78123456

代码:

  1. private void shift_k1(int[] a, int k) {
  2. int n = a.length;
  3. k = k % n;
  4. reverse(a,0,n-k-1);
  5. reverse(a,n-k,n-1);
  6. reverse(a,0,n-1);
  7. }
  8. private void reverse(int[] a, int i, int j) {
  9. for(; i<j; i++,j--){
  10. int tmp = a[i];
  11. a[i] = a[j];
  12. a[j] = tmp;
  13. }
  14. }

方法二:

使用arraylist来存储k位后面的数,数组的前K位依次向后移动k位,最后将集合中的后k位数放到a的前k位中,注意对于K需要%a.length.

代码:

  1. private int[] shift_k(int[] a, int k) {
  2. k = k % a.length;
  3. if(k == 0){
  4. return a;
  5. }
  6. ArrayList<Integer> q = new ArrayList<Integer>();
  7. for(int j=a.length-k; j<a.length; j++){
  8. q.add(a[j]);
  9. }
  10. for(int i=a.length-k-1; i>=0; i--){
  11. a[i+k] = a[i];
  12. }
  13. for(int i=0; i<k; i++){
  14. a[i] = q.get(i);
  15. }
  16. return a;
  17. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/567492
推荐阅读
相关标签
  

闽ICP备14008679号