题目及测试用例
package pid344;
/*反转字符串
编写一个函数,其作用是将输入的字符串反转过来。
示例 1:
输入: "hello"
输出: "olleh"
示例 2:
输入: "A man, a plan, a canal: Panama"
输出: "amanaP :lanac a ,nalp a ,nam A"
*/
public class main {
public static void main(String[] args) {
String [] testTable = {"hello","A man, a plan, a canal: Panama","av12,./34\\45"};
for (String ito : testTable) {
test(ito);
}
}
private static void test(String ito) {
Solution solution = new Solution();
String rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.reverseString(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println(":rtn" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,5ms,速度较慢)
建立一个stringbuilder,将string的顺序 charAt(i) 插入stringbuilder,最后再转为字符串
package pid344;
import java.util.Arrays;
public class Solution {
public String reverseString(String s) {
//相当于重写stringbuilder的reverse方法
StringBuilder build=new StringBuilder();
int length=s.length();
for(int i=0;i<length;i++){
build.append(s.charAt(length-1-i));
}
return build.toString();
}
}
解法2(成功,4ms,很快)
新的时候,这次改为参数为char数组,在该数组内修改
使用双指针,在前后两头逐个交换,交换后begin++,end–
交换的时候可以使用O(1)空间存储,也可以像这样使用亦或交换
public void reverseString(char[] s) {
int length=s.length;
int begin=0;
int end=length-1;
while(begin<end){
s[begin]=(char) (s[begin]^s[end]);
s[end]=(char) (s[begin]^s[end]);
s[begin]=(char) (s[begin]^s[end]);
begin++;
end--;
}
}