上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是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)的更多相关文章

  1. 【JS】JS数组添加元素的三种方法

    1.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 1).语法: arrayObject.push(newelement1,newelement2,....,newelement ...

  2. js数组去重的三种方法

    <script type="text/javascript"> /*// 第一种冒泡法删除 var arr=[1,2,2,78,3,456,456]; for(var ...

  3. 数组去重的三种方法及from方法

    直接上代码: var str="adbbckddwerivka"; var arr=str.split(""); console.log(arr); //ind ...

  4. js 数组去重的三种方法(unique)

    方法一: Array.prototype.unique=function(){ var arr=[];//新建一个临时数组 for(var i=0;i<this.length;i++){//遍历 ...

  5. perl 判断数组相等的三种方法

    1.数组相等,数组成员相同,位置也相同 一般的如果判断@array1 等于 @array2 a.数组长度相同 $#array1=$#array2, 比较数组长度,不能使用length函数,length ...

  6. 数组去重的三种方法 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)); } ...

  7. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  8. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  9. (PASS)JAVA数组去重 三种方法 (不用集合)

    第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01; import java.sql.Array; import ...

随机推荐

  1. Qt 学习之路 2(24):Qt 绘制系统简介

    Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...

  2. 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 ...

  3. Codeforces - 625B 贪心

    求最小不重复匹配次数 改最后一个字符最划算 我当时怎么就没看出来.. #include<bits/stdc++.h> using namespace std; string S,T; in ...

  4. 13-----BBS论坛

    BBS论坛(十三) 13.1点击更换图形验证码 (1)front/signup.html <div class="form-group"> <div class= ...

  5. 在新项目下使用rbc权限

    例子说明: 8 个步骤 1. 拷贝rabc这个app到项目中 2. 把迁移过来的rbac下migrations记录删除 3. 把rabc注册到项目中 4. 创建数据库迁移 5. 注册admin,录入数 ...

  6. 终极版clearFix——支持IE6+

    /*兼容IE6.7*/ /*这段代码非常暴力,from internet,墙裂推荐*/ .clearFix:before,.clearFix:after{ content:""; ...

  7. Linux安装mysql记录 重置密码

    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  8. KEIL中头文件使用配置向导

    在xxx.h头文件的代码中夹杂的“<h>      </h>”.“<o>”“<i>”.“<c1>   </c>”和“<e& ...

  9. VS Ctrl + Shift + Q

    在VS中按 Ctrl + Shift + Q 可以快速查找 void OnCollisionStay  等方法. void OnCollisionStay(Collision collision) { ...

  10. [转]js 判断js函数、变量是否存在

    本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...