实现字符串反转,有很多方法,我想递归是可以实现的。我们再来看Java给我们实现的方法,使用的是前半部分和后半部分字符交换的方法(不错,记得在学C的时候,当时老师也是教我们这样做的)。
先看看怎么使用这个方法。
public static String reverseStr(String orignalStr){ StringBuilder sBuffer = new StringBuilder(orignalStr); sBuffer.reverse(); return sBuffer.toString(); }
再看看JDK实现的源码:
public AbstractStringBuilder reverse() {
boolean hasSurrogate = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; --j) {//此处右移一位就是除以2
char temp = value[j];
char temp2 = value[n - j];
if (!hasSurrogate) {
hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
|| (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
}
value[j] = temp2;
value[n - j] = temp;
}
if (hasSurrogate) {
// Reverse back all valid surrogate pairs
for (int i = 0; i < count - 1; i++) {
char c2 = value[i];
if (Character.isLowSurrogate(c2)) {
char c1 = value[i + 1];
if (Character.isHighSurrogate(c1)) {
value[i++] = c1;
value[i] = c2;
}
}
}
}
return this;
}
其实整个方法并不难看懂;除了StringBuilder外,同样StringBuffer也拥有。这个方法给我的思考是右移的使用,从数电我们可以知道,计算机的乘除法使用的是移位操作来实现的;因此可以看得出,乘除的最基本实现还是来源于移位操作。固然直接使用移位可以提高效率;对于简单的乘除,这个应该作为一种编程习惯。