1.输入一个英语句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student。”,则输出“student. a am I”。
算法思想:先翻转整个句子,然后,依次翻转每个单词。并依据空格来判断单词起始和终止的位置。
可执行代码:
public class Solution {
public String ReverseSentence(String str) {
char[] chars = str.toCharArray();
reverse(chars, 0, chars.length - 1);
int blank = -1;
for(int i = 0;i < chars.length;i++){
if(chars[i] == ' '){ //若句子中存在空格
int nextBlank = i;
reverse(chars,blank + 1,nextBlank - 1);
blank = nextBlank;
}
}
reverse(chars,blank + 1,chars.length - 1); //句子中的最后一个单词进行翻转
return new String(chars);
}
private 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--;
}
}
}
2.举一反三:对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
算法思想:把上述字符串看成两部分,前三个字符以及剩余的字符。首先,对前三个字符进行翻转;然后对剩余部分进行翻转;最后,对整个字符串进行翻转。
可执行代码:
public class Solution {
public String LeftRotateString(String str,int n) {
int len = str.length();
if(len == 0) return "";
n = n % len;
char[] chars = str.toCharArray();
reverse(chars,0,n - 1);
reverse(chars,n,chars.length - 1);
reverse(chars,0,chars.length - 1);
return new String(chars);
}
private 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--;
}
}
}