一个经典,基本的问题:翻转字符串
problem link:https://leetcode.com/problems/reverse-string/
note:
(1)String类的方法substring(beginindex,endindex)两个参数如果相同返回的是空字符串
(2)stringbuilder的replace方法和string的substring方法指针超了一位没关系,即在取最后一位的时候,只有在取最后一位的时候
(3)java中string可以变为char数组,toCharArray方法,然后作为数组操作
(4)以下解法都是sita(n)的复杂度,但是效率完全不同,有的甚至会超时,尽量不要使用java本身提供的方法,会影响效率
(5)使用异或操作(相同为0,不同为1,与0异或是其本身)
word[i] = (char) (word[i] ^ word[j]);
word[j] = (char) (word[i] ^ word[j]);
word[i] = (char) (word[i] ^ word[j]);
可以使word[i]及word[j]的值互换
code:
(1)效率最低的一种写法
public class Solution {
public String reverseString(String s) {
int len=s.length();
注意特殊情况
if(len==1 || len==0)
return s;
//注意特殊情况
int halfLen=len/2;
StringBuilder strb=new StringBuilder(s);
for(int i=0,j=len-1;i<halfLen;i++,j--){
strb.replace(i,i+1,s.substring(j,j+1));
strb.replace(j,j+1,s.substring(i,i+1));
}//replace方法和substring方法指针超了一位没关系,即在取最后一位的时候,只有在取最后一位的时候
return strb.toString();
}
}
(2)转变为char数组,打败一半的人,效率比较高的一种写法
public class Solution{
public String reverseString(String s){
if(s == null || s.length() == 0)
return "";
char[] cs = s.toCharArray();
int begin = 0, end = s.length() - 1;
while(begin <= end){
char c = cs[begin];
cs[begin] = cs[end];
cs[end] = c;
begin++;
end--;
}
return new String(cs);
}
}
有个疑问,不用char数组,用byte数组就会效率除以2??
(3)TLE:(time limit exceeding)
/*public class Solution {
public String reverseString(String s) {
int len=s.length();
if(len==1 || len==0)
return s;
if(len==2)
return s.substring(1)+s.substring(0,1);
if(len==3)
return s.substring(2)+s.substring(1,2)+s.substring(0,1);
int halfLen=len/2;
for(int i=1,j=len-2;i<halfLen;i++,j--){
s=s.substring(0,i)+s.charAt(j)+s.substring(i+1,j)+s.charAt(i)+s.substring(j+1);
}
s=s.charAt(len-1)+s.substring(1,len-1)+s.charAt(0);
return s;
}
}*/
/*
public class Solution {
public String reverseString(String s) {
String res="";
for(int i=s.length()-1;i>=0;i--){
res+=s.charAt(i);
}
return res;
}
}
*/