问题描述:

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

分析:

方法一:

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

步骤:

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

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

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

代码:

private void shift_k1(int[] a, int k) {int n = a.length;k = k % n;reverse(a,0,n-k-1);reverse(a,n-k,n-1);reverse(a,0,n-1);}
private void reverse(int[] a, int i, int j) {for(; i<j; i++,j--){int tmp = a[i];a[i] = a[j];a[j] = tmp;}}

方法二:

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

代码:

private int[] shift_k(int[] a, int k) {k = k % a.length;if(k == 0){return a;}ArrayList<Integer> q = new ArrayList<Integer>();for(int j=a.length-k; j<a.length; j++){q.add(a[j]);}for(int i=a.length-k-1; i>=0; i--){a[i+k] = a[i];}for(int i=0; i<k; i++){a[i] = q.get(i);}return a;}

数组:如何把一个数组循环右移K位相关推荐

  1. c语言将数组元素循环右移k位,把一个含有N个元素的数组循环右移K位

    普通解法: 可以每次将数组中的元素右移一位,循环K次.每个元素右移N位后都会回到自己的位置上.因此,如果K > N,右移K-N之后的数组序列跟右移K位的结果是一样的.进而可得出一条通用的规律:右 ...

  2. java 数组元素依次右移,将数组元素循环右移k个位置(Java实现)

    用四种方法实现了将数组元素循环右移k个位置,相关的解释作为注释放在代码里面了. package movearrayelement; import java.util.BitSet; public cl ...

  3. 旋转数组(将数组元素循环右移k次)

    189.旋转数组(将数组元素循环右移k次) 题目: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 1. 每次只将最后一个元素右移至数组头部位置,重复k%nums.length ...

  4. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素

    Find Minimum in Rotated Sorted Array II 原题链接Find Minimum in Rotated Sorted Array II 一个有序数组循环右移n位,找到右 ...

  5. 数组循环向左移动k位的算法

    数组循环向左移动k位的算法, 我在课本上只看到了方法一,暂且称为颠倒交换法, 方法二是我自己想出来的,暂且称为循环赋值法. 方法一:颠倒交换法 算法描述:循环左移k位, 先把前面 0 到 k-1位置的 ...

  6. 数组合并假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法,将这 n 个数组合并到一个数组,且各元素按升序排列。即实现函数-C-icoding-排序-数据结构

    数组合并 假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法, 将这 n 个数组合并到一个数组,且各元素按升序排列.即实现函数: void merge_arrays(const ...

  7. 重新排列数组[数组] 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,x

    .重新排列数组[数组] 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列.请你将数组按 [x1,y1,x2,y2,...,xn, ...

  8. php发牌判断哪个玩家对子多,PHP判断一个数组是另一个数组子集的方法详解

    本文实例讲述了PHP判断一个数组是另一个数组子集的方法.分享给大家供大家参考,具体如下: 前言 今天完成一个算法的过程中,有几个需求模块,其中就有判断$a数组是否是$b数组的子集,可能最近我写c比较多 ...

  9. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

最新文章

  1. WINCE 按键驱动编写
  2. React Native之箭头函数和延展操作符(...)
  3. 深入理解Android消息处理系统——Looper、Handler、Thread
  4. jsonp解析 html
  5. python 不同模块之间的引用错误问题
  6. flink的web ui出现Server Response:Unable to load requested file /jars
  7. cygwin下的gcc-4.7.1编译心得
  8. springboot 2.x 使用定时任务执行多次问题
  9. js中top,left,height,width相关参数的解析和实例
  10. Android 编程下 ListView 的 HeaderView 和 FooterView 不可选择点击
  11. Java中文汉字转汉语拼音
  12. ArchLinux安装蓝牙驱动
  13. C语言字符与数字的互转
  14. 洞态IAST源码分析及吐槽
  15. css3之通用兄弟元素选择器
  16. 计算机由哪几种显卡,各类显卡大比拼,你会选择哪一款显卡使用?
  17. 阿里----OSS对象存储服务
  18. ssssssssssss
  19. Android自定义桌面墙纸
  20. 【Proverif语法学习(一)】

热门文章

  1. 中国基金业将迎来第三次浪潮[ZT]
  2. 绝对定位的子盒子无法撑开父盒子的原因和解决方案
  3. 2021-2025年中国口腔清洁用品行业市场供需与战略研究报告
  4. android灰字体什么意思,Android 6.0状态栏使用灰色文字和图标
  5. 地质灾害在线监测系统解决方案
  6. 软件开发(一)——软件开发的基础思考
  7. 嵌入式单片机高级篇(三)Stm32F103+OV2640摄像头
  8. AI博士毕业,要求多少年薪才不亏?中美最高超过200万,日本还没公务员挣得多...
  9. 结婚后谁管钱更高效?怎样越管越多?
  10. OCV、AOCV、POCV、LVF介绍