问题描述:

假设要把数组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. Android selinux权限修改
  2. openstack介绍(二)
  3. CentOS7时间设置问题
  4. VUE:兄弟组件间传参
  5. 机器人搏击大赛冠军_机器人的江湖 谁主沉浮——2017格斗机器人大赛侧记
  6. Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)...
  7. [SQL]实战之统计出当前各个title类型对应的员工当前薪水对应的平均工资
  8. linux下/proc/cpuinfo 文件分析
  9. JavaScript专题之跟着 underscore 学节流
  10. 数据结构严蔚敏清华大学pdf_2021年清华(清华大学)电子信息考研
  11. Java输入/输出流
  12. iphone11支持es6吗_我这样用拼多多砍价群,拿到了不要钱的iPhone11
  13. Win7 中使用 blat 自动发邮件
  14. LVGL+NES|基于lvgl实现nes模拟器(lv_100ask_nes)
  15. win10 注册表无法删除项
  16. 高校房产管理系统应具备哪些基本功能?
  17. Flutter 调用百度地图APP实现位置搜索、路线规划
  18. 02 Redis 底层数据结构
  19. IT宅男利用Python网络爬虫获取有道翻译手机版翻译接口
  20. Two Bags of Bread

热门文章

  1. AtCoder Beginner Contest 282 A-E
  2. Atcoder 221
  3. Centos7 部署Kubenetes文档
  4. python ransac_如何在Python OpenCV中应用RANSAC
  5. 让婴儿早一天活动起来
  6. 37. flex布局
  7. 分治法的概念以及应用
  8. nuc7 可以装linux么,怎么在NUC7I7DNKE上安装最新的以太网设备驱动程序
  9. android profiler 简书,(三)Android 性能优化 Network Profiler
  10. 三星、微软高调推新品,平板行业“风水轮流转”?