您的位置:首页 > 其它

左旋转字符串

2014-09-25 16:27 197 查看
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

输入:多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。

输出:
对应每个测试案例,输出新序列。

package Test21;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.next();
int n = scanner.nextInt();
System.out.println(revString(str, n));

}

}

/**
* ①:注意n的取值问题,因为是循环移位,所以可以采用取余数的方式 ②:借助了StringBuffer:来提高性能
* ③:借助了subString(beginIndex,endIndex)来简化了计算
* 性能分析:时间复杂度为o(n)---subString;空间复杂度为o(n)---StringBuffer
*
* @param str
* @param n
* @return
*/

public static String reverse(String str, int n) {
StringBuffer stringBuffer = new StringBuffer();

int length = str.length();

int m = n % length;

if (m < 0) {

return str;
}
// 直接将子字符串进行分割就行了,然后将分割的子串拼接在一起
stringBuffer.append(str.substring(m, str.length())).append(
str.substring(0, m));

return stringBuffer.toString();

}

/**
* 思想:我们还是把字符串看成有两段组成的,记位XY。
* 左旋转相当于要把字符串XY变成YX。我们先在字符串上定义一种翻转的操作,
* 就是翻转字符串中字符的先后顺序。把X翻转后记为XT。显然有(XT)T=X。
*
* 我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。
* 接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。
* 正好是我们期待的结果。
* ①:首先对前半部分逆序;
* ②:然后对后半部分逆序;
* ③:然后对整体进行逆序
* 性能分析:时间复杂度为o(n),空间复杂度为o(1)
*
* @param str
* @param n
* @return
*/
public static String revString(String str, int n) {

if (str.length() == 0) {
return str;
}
char[] c = str.toCharArray();
int m = n % str.length();
// 将(0,m)的字符翻转

int firstA = 0, lastA = m - 1;
while (firstA < lastA) {

char temp = c[firstA];
c[firstA] = c[lastA];
c[lastA] = temp;
firstA++;
lastA--;
}

// 再将(m,str.length翻转)
int firstB = m, lastB = str.length() - 1;
while (firstB < lastB) {
char temp = c[firstB];
c[firstB] = c[lastB];
c[lastB] = temp;
firstB++;
lastB--;
}

// 再将字符串全部翻转
int firstC = 0, lastC = str.length() - 1;
while (firstC < lastC) {
char temp = c[firstC];
c[firstC] = c[lastC];
c[lastC] = temp;
firstC++;
lastC--;
}

return new String(c);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: