通过求逆来翻转字符串
题目及思路来源自《编程珠玑》 2.3
题目
将一个字符串某一位之前的所有元素移到队尾。
如
原字符串 | 定位 | 移动后字符串 |
---|---|---|
abcdefghijklmnopqrstuvwxyz | 5 | fghijklmnopqrstuvwxyzabcde |
abcdefghijklmnopqrstuvwxyz | 10 | klmnopqrstuvwxyzabcdefghij |
方法
翻手法,亦即向量求逆。
s = a + b
设a = abcd;
则a' = bcda;
翻转后
s1 = s' = (a' + b')'
代码
public class VectorRotate {
private String str ;
private String fStr;
private String lStr;
public VectorRotate(int i){
str = "abcdefghijklmnopqrstuvwxyz";
fStr = str.substring(0, i);
lStr = str.substring(i);
}
public String sWap(String s){
String as = "";
for(int i = s.length()-1; i >=0 ;i--){
as += s.charAt(i)+"";
}
return as;
}
public static void main(String[] args) {
int i = 10;
System.out.println(vr.sWap(vr.sWap(vr.fStr) + vr.sWap(vr.lStr)));
}
}
运行
原字符串:"abcdefghijklmnopqrstuvwxyz"
位置:5
转换后
原字符串:"abcdefghijklmnopqrstuvwxyz"
位置:10
转换后
连续执行一百万次
long time = System.currentTimeMillis();
for(int j=0;j<1000000;j++)
vr.str = vr.sWap(vr.sWap(vr.fStr) + vr.sWap(vr.lStr));
time = System.currentTimeMillis() - time;
System.out.println(vr.str+" time: "+time+"ms");
输出
字符串有十万位
public VectorRotate(int i,int k){
//10000*10 = 100000
str = "";
for(int j = 0; j<10000 ; j++)
str += "abcdefghij";
fStr = str.substring(0, i);
lStr = str.substring(i);
}
输出
分析
在求字符串的逆时浪费了过多的时间,导致结果并不是很理想,在有10万位时速度明显降低。求逆算法待优化。