题目
例如输入 I am a student. 则输出 student. a am I
思路 翻转两次
- 第一步翻转句子中所有字符,比如翻转 I am a student. 中的字符串为 .tneduts a ma I ,此时不但翻转了句子,单词也翻转了
- 在翻转每个单词,翻转单词的时候扫描空格来确定单词的起始位置和终止位置
public String ReverseSentence(String str) {
if(str==null)
return null;
char[] chars=str.toCharArray();
swap(chars,0,chars.length-1);
int begin=0,end=0;
while(begin<chars.length){
while(begin<chars.length&&chars[begin]==' ')
begin++;
end=begin+1;
while(end<chars.length&&chars[end]!=' ')
end++;
swap(chars,begin,end-1);
end++;
begin=end;
}
return new String(chars);
}
private void swap(char[] chars,int left,int right){
char temp;
while(left<right){
temp=chars[left];
chars[left]=chars[right];
chars[right]=temp;
left++;
right--;
}
}
左旋转字符串
字符串的左旋转是把字符串前面的若干个字符转移到字符串的尾部。定义一个函数实现字符串左旋转操作的功能,比如输入字符串“abcdefg”和数字2,改函数将返回左旋2位得到的数结果是“cdefgab”
思路
把原序列分成两部分,A=(abc),B=(defg),原序列为AB,我们要的结果为BA,则可以这么做:(ArBr)r = ((B)r)r((A)r)r=BA
public String LeftRotateString(String str,int n) {
char[] chars = str.toCharArray();
if(chars.length < n) return "";
reverse(chars, 0, n-1);
reverse(chars, n, chars.length-1);
reverse(chars, 0, chars.length-1);
StringBuilder sb = new StringBuilder(chars.length);
for(char c:chars){
sb.append(c);
}
return sb.toString();
}
public void reverse(char[] chars,int low,int high){
char temp;
while(low<high){
temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}