标签:style color os java ar strong 数据 问题 on
对应每个测试案例,输出新序列。
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);
}
}
标签:style color os java ar strong 数据 问题 on
原文地址:http://blog.csdn.net/shiyeqiangldh/article/details/39553493