一、第一种方法,都想得到的。
static int[] LeftShift1(int[] arr,int K){//K为循环左移位数
int N=arr.length;
int[] new_arr=new int[N]; //新开一个数组,空间复杂度O(n)
for(int i = 0; i <N; i++)
new_arr[i] = arr[(K+i)%N ];
return new_arr;
}
二、利用“翻转”完成优化,《编程之美》上的算法
考虑一下数组A中元素1234567循环左移2位到底是怎么个情况!!!将数组A分成两个部分:A[0~k-1] 和 A[k~n-1] ,(12与34567)将这两个部分分别翻转,然后放在一起在翻转(逆序)。具体是这样的:
(1)翻转12:12 ---> 21
(2)翻转34567: 34567 ---> 76543
(3)一起翻转2176543:2176543 --->3456712
//翻转b~e
static void Reverse(int[] arr, int b, int e){
while(b < e){
int temp = arr[e]; //只需新开一个辅助空间
arr[e] = arr[b];
arr[b] = temp;
b++;
e--;
}
}
//左移K位
static void LeftShift(int[] arr, int K){
int N=arr.length;
//如果K>N,取K=K%N。
K %= N;
Reverse(arr, 0, K - 1);
Reverse(arr, K, N - 1);
Reverse(arr, 0, N - 1);
}
第一种算法有O(n)的空间复杂度,第二种有O(1)的空间复杂度,两种算法时间复杂度同为O(n)。
测试程序:
public class Test{
//方法一
static int[] LeftShift1(int[] arr,int K){//K为循环左移位数
int N=arr.length;
int[] new_arr=new int[N];
for(int i = 0; i <N; i++)
new_arr[i] = arr[(K+i)%N ];
return new_arr;
}
static void print(int[] arr){
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+" ");
System.out.println();
}
//翻转b~e
static void Reverse(int[] arr, int b, int e){
while(b < e){
int temp = arr[e];
arr[e] = arr[b];
arr[b] = temp;
b++;
e--;
}
}
//方法二
static void LeftShift(int[] arr, int K){
int N=arr.length;
K %= N;
Reverse(arr, 0, K - 1);
Reverse(arr, K, N - 1);
Reverse(arr, 0, N - 1);
}
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7};
print(a);
int[] new_arr = LeftShift1(a,2);
print(new_arr);
// Reverse(a,2,5);
LeftShift(a, 4);
print(a);
}
}
运行:
C:\ex>java Test
1 2 3 4 5 6 7
3 4 5 6 7 1 2
5 6 7 1 2 3 4
- 大小: 48.8 KB
分享到:
相关推荐
C语言是计算机科学领域基础且重要的编程语言,尤其在考研中占据着重要地位。这篇资料集包含的是“C语言考研试题和历年考试题”,对于准备考研的学子来说是一份宝贵的资源。下面我们将深入探讨C语言的一些核心知识点...
8. **数组元素循环左移**:这个操作通常用于数组数据的位移处理,比如在密码学中的移位加密。通过循环移动数组元素,将第一个元素移到数组末尾,其他元素依次前移一位。 9. **判断素数**:素数是只有1和本身两个正...
从给定的文件信息中,我们可以提取出三个主要的知识点:散列表的构建与分析、数组的循环左移算法设计及实现、以及基于16位计算机的指令系统设计与解析。下面将对这三个知识点进行详细阐述。 ### 散列表的构建与分析...
以数组循环左移为例,题目要求将数组中的元素循环左移P个位置。解决此类问题的关键在于理解算法的逻辑和时间复杂度。如上述示例所示,通过三次逆置操作可以实现数组元素的循环左移,这种方法的时间复杂度为O(n),...
- **示例**:例如,以下是一个将一维数组中的序列循环左移P个位置的示例算法。该算法采用了简洁明了的方式,去除了不必要的注释和标准库引入。 ```cpp void Reverse(int R[], int l, int r) { int i, j; int temp...
### 福建师范大学614计算机基础2021年考研专业课初试大纲解析 #### 一、概述 福建师范大学2021年的计算机基础考研初试大纲旨在考查学生在C语言程序设计、数据结构以及数据库原理等方面的基础知识与技能。该大纲...
3. 〔10 年〕设将 n(n,1)个整数存放到一维数组 R 中,试设计一个在时间和空间两方面尽可能有效的算法,将 R 中保有的序列循环左移 P〔0Pn﹤ ﹤ 〕个位置,即将 R 中的数据由〔X0 X1 ……Xn-1〕变换为〔Xp Xp+1 ……...
在掌握了知识要点后,应通过专项练习来巩固,例如PPT中提到的循环左移数组的问题,要求设计一个算法在O(n)的时间复杂度和O(1)的空间复杂度下完成。这需要理解和运用位运算、数组操作等技巧。 最后,做真题和模拟题...
2. 循环左移一维数组中的元素,这里通过分段逆置数组的方式来解决,是一个高效的时间和空间复杂度的解法。 3. 求两个等长升序序列的中位数问题,采用二路归并思想来解决问题,这是合并排序中的一个步骤,体现了...
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究...
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究...
- 多层循环用于处理二维数组或需要嵌套操作的情况。 **break 和 continue** - `break` 用于立即退出循环。 - `continue` 用于跳过当前循环中的剩余代码并继续下一次循环。 #### 第六章 数组 **一维数组** - 定义...
C语言作为计算机科学的基础语言,对于考研和面试的准备至关重要。以下将对一些常见的C语言编程题目进行详细讲解,帮助读者深入理解和应用C语言。 一、基础语法篇 1. 变量声明与类型转换:在C语言中,变量必须先...