算法篇之字符串逆序
倒序赋值法
思路:开辟一个新的同长度的字符串、将旧字符串的字符进行倒序赋值进去、时间复杂度 O(n),额外空间复杂度O(n)
java 代码示例
public String reverseTo(String t){
char[] other = t.toCharArray();
for (int i=0;i<t.length();i++){
other[i] = t.charAt(other.length-i-1);
}
return new String(other);
}
原地转换法
思路:对称转换、即降最后一个字符跟第一个字符位置互换、依次往中间类推、注意转换次数为n/2,时间复杂度O(n),需额外空间复杂度O(1)
java 代码示例
public String setConversion(String t){
char[] other = t.toCharArray();
for (int i=0;i<t.length()/2;i++){
char tmp = other[i];
other[i] = other[other.length-1-i];
other[other.length-1-i] = tmp;
}
return new String(other);
}
使用函数库
java 方法
public String reverse(String t){
StringBuffer sb =new StringBuffer(t);
String s = sb.reverse().toString();
return s;
}
函数库reverse源码分析
public AbstractStringBuilder reverse() {
boolean hasSurrogates = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
char cj = value[j];
char ck = value[k];
value[j] = ck;
value[k] = cj;
if (Character.isSurrogate(cj) ||
Character.isSurrogate(ck)) {
hasSurrogates = true;
}
}
if (hasSurrogates) {
reverseAllValidSurrogatePairs();
}
return this;
}
从源码可以看出底层库实际使用的算法是原地转换法