您的位置:首页 > 其它

数组循环移位(左旋转字符串)

2013-08-17 17:05 543 查看

数组循环移位

设计一个算法,把一个含有N个元素的数组循环移位K位,要求时间复杂度为O(N),且只允许使用两个附加变量

No.1 K abcd1234→ 4abcd123→....

代码如下:
/*
* 数组移位第一种方法,一位一位的移动
* arr要移动的数组 K移动的位数
* 时间复杂度O(N^2)
*/
public static String rotateFirst(String rotateSting,int K)
{
char[] arr=rotateSting.toCharArray();;
int N= arr.length;
K %= N;  //如果K>N,则K-N之后的数组序列跟移动K位是一样的
while(K!=0)
{
arr[0]=arr[N-1];   //先给arr[0]赋值
for(int i=N-1;i>0;i--)   //倒者赋值
{
arr[i]=arr[i-1];
}
K--;
}
return new String(arr);
}


No.2  逆序

/*
* 数组移位第二种方法
* 1.逆序排列abcd: abcd1234 → dcba1234
* 2.逆序排列1234: dcba1234 → dcba4321
* 3.全部逆序 dcba4321 → 1234abcd
* 时间复杂度 O(N)线性时间
*/
public static String rotateSecond(String rotateSting,int K)
{
char[] arr=rotateSting.toCharArray();;
int N= arr.length;
K %= N;  //如果K>N,则K-N之后的数组序列跟移动K位是一样的
arr=Reverse(arr,0,K-1);
arr=Reverse(arr,K,N-1);
arr=Reverse(arr,0,N-1);
return new String(arr);
}
/*
* 逆序
* arr逆序数组 be逆序开始位置 en结束位置
*/
public static char[] Reverse(char[] arr,int be,int en)
{
for(;be<en;be++,en--)
{
char temp=arr[en];
arr[en]=arr[be];
arr[be]=temp;
}
return arr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数组 旋转 移位