问题描述:

将n(n>1)个整数存放在一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法。 将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据(x0,x1,x2,…x(n-1))变换为(xp,x(p+1),…,x(n-1),x0,x1,…,x(p-1))

示例:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]左移4位[5, 6, 7, 8, 9, 10, 1, 2, 3, 4]

中间数组辅助法

解题思路:定义一个中间数组temp[ ] 来辅助 R[ ]数组 的元素进行移动。

  1. 看下面代码的reverse方法,共有3个for循环。这3个for循环,是该算法实现元素循环左移的核心代码.

假设数组R = [1,2,3,4,5,6,7,8,9,10] ,向左移动4位 (p = 4)

  1. 第一个for循环:将数组R中,前p个元素 暂存到 temp数组中。
  2. 第二个for循环:将数组R中,后n-p个元素整体左移p个位置。(其实左移用在这里不太恰当,应该说:将后n-p个元素的值 赋给 前n-p个元素)
  3. 第三个for循环:将第一个 for 循环中,暂存在 temp 数组中的元素,依序赋值给 R数组中的后p个元素
public class Solution_3 {public static void reverse(int[] R, int p) {//中间数组int[] temp = new int[R.length];//将R数组中,前p个元素 暂存到 temp数组中for (int i = 0; i < p; i++) {temp[i] = R[i];}//将R数组中,后n-p个元素整体左移p个位置for (int i = p; i < R.length; i++) {R[i-p] = R[i];}//将暂存在 temp 数组中的元素,依序赋值给 R数组中的后p个元素int start = 0;for (int i = R.length-p; i < R.length; i++) {R[i] = temp[start++];}}public static void main(String[] args) {int[] R = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int p = new Scanner(System.in).nextInt();reverse(R, p);//将数组以字符串格式打印输出System.out.println(Arrays.toString(R));}
}

时空复杂度:该算法只有单层循环,时间复杂度为O(n),因为外部内存中开了一个长度为n的中间数组,空间复杂度也为O(n)。

代码优化:前面reverse方法中,第一第二个代码我们可以进行合并。

解析:将元素暂存到temp数组 和 将R数组元素左移的步骤合并到一个for循环中。但需要注意的是,前面第一个for循环是直接将p个元素暂存到temp数组中。而合并后,是将n-p个元素暂存到temp数组中。因为R数组中有n-p个元素需要左移。

for (int i = 0; i < R.length-p; i++) { // T(n) = 3n = O(n)//将R数组中,前n-p个元素 暂存到 temp数组中temp[i] = R[i];//将R数组的后n-p个元素 赋值 给前面的n-p个元素R[i] = R[i + p];
}

时空复杂度:这一步并没有降低算法的时间复杂度,还是O(n)。仅仅只是代码量减少了

数组元素逆置法

解题思路:将R数组分割成a,b两个部分,然后分别将a,b两个部分的元素逆置,最后再将R数组整体逆置。所以需要三次调用元素逆置算法 。

public class Solution_2 {private static void reverse(int[] R, int left, int right) {//数组元素互置算法(其实就是两个数的互换)for(int i = 0; i <= (right - left)/2; i++){int temp = R[left + i];R[left + i] = R[right - i];R[right - i] = temp;}}private static void move(int[] R, int n, int p) {//将数组中第一部分的元素逆置reverse(R,0,p - 1);//将数组中第二部分的元素逆置reverse(R, p,n - 1);//将整个数组的元素逆置reverse(R,0,n - 1);}public static void main(String[] args) {int[] R = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int p = new Scanner(System.in).nextInt();move(R, R.length, p);//以字符串格式,将数组打印输出System.out.println(Arrays.toString(R));}
}

时空复杂度:该算法中用的都是一重循环,时间复杂度为O(n),因为基本没有用到外部内存,空间复杂度为O(1)。

数组元素循环左移n个位置(JAVA)相关推荐

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

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

  2. C语言数组元素循环左移

    void fun(char * w,int m) { int i,n=0; char t; while(w[n]!=0) n++; for(i=0;i<m;i++) { t=w[0]; for( ...

  3. 问题:数组的循环左移。要求设计三种算法,将数组中的N个元素能够实现循环左移p个位置。

    问题重述:数组的循环左移.要求设计三种算法,将数组中的N个元素能够实现循环左移p个位置. 算法1: 先将数组中的前p个元素存放在一个临时数组中,再将余下的N-p个元素左移p个位置,最后将前p个元素从临 ...

  4. 7-1 数组元素循环右移问题 (20 分)

    7-1 数组元素循环右移问题 (20 分) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A​1 ⋯A​N−1​​ ...

  5. C++学习之路 | PTA乙级—— 1008 数组元素循环右移问题 (20分)(精简)

    1008 数组元素循环右移问题 (20分) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A ​0 ​​ A ​1 ​​ ...

  6. 浙江大学PAT上机题解析之1008. 数组元素循环右移问题 (20)

    1008. 数组元素循环右移问题 (20) 时间限制  400 ms 内存限制  32000 kB 代码长度限制  8000 B 判题程序    Standard 一个数组A中存有N(N>0)个 ...

  7. c++string转char数组_C++ 算法题解:打印沙漏、素数对猜想、数组元素循环右移问题...

    作者:鲸90830  链接:https://www.cnblogs.com/whale90830/p/10688802.html DS_起步自测 中国大学MOOC_陈越.何钦铭_数据结构_起步能力自测 ...

  8. 7-2 数组元素循环右移问题 (40 分)

    ** 7-2 数组元素循环右移问题 (40 分) ** 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A 0 A 1 ⋯ ...

  9. 1008 数组元素循环右移问题(C语言)

    1008 数组元素循环右移问题 (20 分) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--A ...

最新文章

  1. ECS(Linux)连接RDS,使用命令行方式连接实例
  2. codeforces 400D Dima and Bacteria 并查集+floyd
  3. NoSQL(二):创建、管理集群
  4. 变量在内存中的值[c][code]
  5. C和指针之字符串之strlen、strcpy、 strcat、strcmp使用总结
  6. Logtail从入门到精通(二):开启日志采集之旅
  7. 运行项目到 微信开发者工具和浏览器
  8. Android系统(40)---进程与线程
  9. 操作日志和系统日志分类记录
  10. Linux常用基础命令3
  11. Vectorworks 2022 SP2 for mac(首选3D建筑设计软件)
  12. wsl使用ssh连接
  13. 0x80070079信号灯超时_[修复]错误0x80070079:信号量超时期限已过 | MOS86
  14. linux查看磁带大小命令,16条实用的Linux/Unix 磁带管理命令
  15. 文字识别场景文字识别
  16. iOS加速计和陀螺仪
  17. 【python】画四叶草
  18. 软件评测师:数据库知识
  19. hackthebox-Toxic writeup
  20. win8.1安装office2016

热门文章

  1. 极品冷幽默,搞笑没得说
  2. PRACH过程中RA-RNTI和C-RNTI的作用
  3. AD仿真功能描述文档
  4. mysql 5.0.8 下载_mysql-connector-
  5. Java SHA-256 算法实例
  6. 基于动态窗口法(DWA)的局部避障算法研究及MATALB的实现
  7. 支持向量机(SVM)——线性支持向量机
  8. 飞机大战实现--c++
  9. #define的用法
  10. android 读文字软件,文字语音朗读软件