数组k平移三种方法(java)
上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是o(1):
public class ArrayKMove { /**
* 问题:数组的向左k平移,k小于数组长度
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub ArrayKMove kmove = new ArrayKMove();
kmove.methodOne();
kmove.methodTwo();
kmove.methodThree();
} private static final int i = 10000;
private static final int testNum = 1000;
private int a[];
private long startTime = 0, timeSpan = 0; public ArrayKMove() {
a = new int[i];
for (int j = 0; j < i; j++) {
a[j] = j;
}
} public void printArray() {
for (int j = 0; j < i; j++) {
System.out.println(a[j]);
}
} public void methodOne() {
this.startTime = System.currentTimeMillis();
for (int k = 1; k <= testNum; k++) {
for (int j = 0; j < k; j++) {
this.moveArrayFirstToLast();
}
}
this.timeSpan = System.currentTimeMillis() - this.startTime;
System.out.println("第一种方法消耗时间:" + timeSpan + "毫秒");
} public void moveArrayFirstToLast() {
int m = a[0];
for (int j = 1; j < i; j++) {
a[j - 1] = a[j];
}
a[i - 1] = m;
} public void methodTwo() {
this.startTime = System.currentTimeMillis();
for (int j = 1; j <= testNum; j++) {
this.swapArray(1, j);
this.swapArray(j + 1, i);
this.swapArray(1, i);
}
this.timeSpan = System.currentTimeMillis() - this.startTime;
System.out.println("第二种方法消耗时间:" + timeSpan + "毫秒");
} public void swapArray(int start, int end) {
for (int s = start - 1, e = end - 1; s < e; s++, e--) {
int temp = a[s];
a[s] = a[e];
a[e] = temp;
}
} public int gcdTwoInt(int m, int n) {
if (m <= 0 && n <= 0)
return 0;
if (m <= 0 || n <= 0)
return m <= 0 ? n : m;
int g;
while (n > 0) {
g = m % n;
m = n;
n = g;
}
return m;
} public void moveByGCD(int k) {
if (k <= 0)
return;
int m = this.gcdTwoInt(k, i);
for (int j = 0; j < m; j++) {
int c = a[j];
int p;
for (p = (j + k) % i; p != j; p = (p + k) % i) {
a[(p - k + i) % i] = a[p];
}
a[(p - k + i) % i] = c;
}
} public void methodThree() {
this.startTime = System.currentTimeMillis();
for (int j = 1; j <= testNum; j++) {
this.moveByGCD(j);
}
this.timeSpan = System.currentTimeMillis() - this.startTime;
System.out.println("第三种方法消耗时间:" + this.timeSpan + "毫秒");
}
}
方法一:基本方法,每次左移一位,移动k次即可,但是时间复杂度是o(kn),这个方法可以用牺牲空间复杂度来提升时间效率,即用一个数组保存要平移的k个数据,把原数组直接平移k位后,再把k位数据直接插在后面k个位置即可,时间复杂度o(n)
方法二:先把前k位翻转,再把后面的n-k位翻转,然后整体翻转,这个画图可以证明。
方法三:不是很好理解,基本思路就是,循环替换,用i+k的值替换i处的值,但是是循环,也就是不能数组越界,还有就是要分m条路线,m是n和k的最大公约数。
测试规模:
数组大小10000,
测试次数1000,
每次平移的位数依次为1-1000次;
测试结果:
第一种方法消耗时间:5364毫秒
第二种方法消耗时间:21毫秒
第三种方法消耗时间:129毫秒
结果分析:
三种方法空间复杂度都是o(1)
时间复杂度依次为o(kn)、o(3n)、o(n)
但是测试时间第三种方法消耗的时间却比第二种大,原因是第三种方法中有求解两个最大公约数的操作,而且有运算较为复杂的求余运算,所以消耗时间增加,方法二中只有交换赋值的操作,比较简单。
数组k平移三种方法(java)的更多相关文章
- 【JS】JS数组添加元素的三种方法
1.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 1).语法: arrayObject.push(newelement1,newelement2,....,newelement ...
- js数组去重的三种方法
<script type="text/javascript"> /*// 第一种冒泡法删除 var arr=[1,2,2,78,3,456,456]; for(var ...
- 数组去重的三种方法及from方法
直接上代码: var str="adbbckddwerivka"; var arr=str.split(""); console.log(arr); //ind ...
- js 数组去重的三种方法(unique)
方法一: Array.prototype.unique=function(){ var arr=[];//新建一个临时数组 for(var i=0;i<this.length;i++){//遍历 ...
- perl 判断数组相等的三种方法
1.数组相等,数组成员相同,位置也相同 一般的如果判断@array1 等于 @array2 a.数组长度相同 $#array1=$#array2, 比较数组长度,不能使用length函数,length ...
- 数组去重的三种方法 es6
[1,2,3,4,5,6,7,8,9,2,2,3,3,4,1].filter(function(el,index,arr){ return (index === arr.indexOf(el)); } ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- java数组中的三种排序方法中的冒泡排序方法
我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...
- (PASS)JAVA数组去重 三种方法 (不用集合)
第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01; import java.sql.Array; import ...
随机推荐
- Qt 学习之路 2(24):Qt 绘制系统简介
Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...
- Codeforces-C-Grid game(思维)
You are given a 4x4 grid. You play a game - there is a sequence of tiles, each of them is either 2x1 ...
- Codeforces - 625B 贪心
求最小不重复匹配次数 改最后一个字符最划算 我当时怎么就没看出来.. #include<bits/stdc++.h> using namespace std; string S,T; in ...
- 13-----BBS论坛
BBS论坛(十三) 13.1点击更换图形验证码 (1)front/signup.html <div class="form-group"> <div class= ...
- 在新项目下使用rbc权限
例子说明: 8 个步骤 1. 拷贝rabc这个app到项目中 2. 把迁移过来的rbac下migrations记录删除 3. 把rabc注册到项目中 4. 创建数据库迁移 5. 注册admin,录入数 ...
- 终极版clearFix——支持IE6+
/*兼容IE6.7*/ /*这段代码非常暴力,from internet,墙裂推荐*/ .clearFix:before,.clearFix:after{ content:""; ...
- Linux安装mysql记录 重置密码
重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...
- KEIL中头文件使用配置向导
在xxx.h头文件的代码中夹杂的“<h> </h>”.“<o>”“<i>”.“<c1> </c>”和“<e& ...
- VS Ctrl + Shift + Q
在VS中按 Ctrl + Shift + Q 可以快速查找 void OnCollisionStay 等方法. void OnCollisionStay(Collision collision) { ...
- [转]js 判断js函数、变量是否存在
本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...