1.题目描述
代码实现:
class Solution {
public String ReverseSentence(String str) {
if(str==null||str.trim().length()==0)
return str;
String[] s = str.split("\\s");
StringBuilder sb = new StringBuilder();
for(int i=s.length-1;i>=1;i--){
sb.append(s[i]);
sb.append(" ");
}
sb.append(s[0]);
return sb.toString();
}
}
说明:
1)可能输入可能是多个连续的空格,此时使用trim()函数去掉字符串的首尾空格。
方法二:课本给出的方法,s=“student. a am I”,先将s翻转一次得到"I ma a .tneduts",再将每个单词翻转一次得到"I am a student.".
class Solution {
public String ReverseSentence(String str) {
if(str==null||str.trim().length()==0)
return str;
char[] ch = str.toCharArray();
exch(ch,0,ch.length-1);
int i = 0;
int j = i;
while(i<ch.length&&j<ch.length){
while(j<ch.length&&ch[j]!=' '){
j++;
}
exch(ch,i,j-1);
i = j + 1;
j = i;
}
return String.valueOf(ch); //将字符数组转为字符串
}
public void exch(char[] ch,int i,int j){
for(int k=i;k<=(i+j)/2;k++){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}
说明:将字符数组转成字符串数组的函数,String.valueOf(char[] ch);2.题目描述
方法一:使用字符串函数拼接方式:例如示例:S="abcXYZdef",K = 3,此时可以使用S.subString(0,n);函数取出前三个字符,再使用S.subString(n,S.length());取出剩下的字符,然后拼在一起。
代码实现:
class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||n<=0||n>=str.length())
return str;
StringBuilder sb = new StringBuilder();
sb.append(str.substring(n, str.length()));
sb.append(str.substring(0, n));
return sb.toString();
}
}
说明:
1)如果左移K位,K大于等于字串的长度,或者K<=0,此时左移后的还是原先的字符串。
2)去子串的函数substring(start,end),包括下标为start的值,不包括下标为end的值。
方法二:s="abcXYZdef",k=3,此时,可以将s分为两部分,第一部分是前面的"abc",后一部分是"XYZdef",首先将"abc"翻转"cbd",然后将"XYZdef"翻转为"fedZYX",就等到到"cbdfedZYX",然后翻转整个字符串得到"XYZdefdbc"。也就是说先部分翻转两次,再一起翻转一次,总共翻转了三次。
代码实现
class Solution{
public String LeftRotateString(String str,int n) {
if(str==null||n<=0||n>=str.length())
return str;
char[] ch = str.toCharArray();
exch(ch,0,n-1);
exch(ch,n,ch.length-1);
exch(ch,0,ch.length-1);
return String.valueOf(ch);
}
public void exch(char[] ch,int i,int j){
for(int k=i;k<=(i+j)/2;k++){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}