输入一个英文句子,翻转句子中单词的顺序,单词顺序不变,标点符号和简单字母一样处理,例如:输入"I am a student" 输出:"student. a am I "
此类题目很常见
解法
- 翻转句子中所有字符
- 再反转每个单词中字符的顺序
有经验的面试官如果看到应聘者几乎不假思索的想出一道比较巧妙的算法,就会觉得他可能见过这个题目,很多面试官会再问一个题目,以考察是不是真的理解这倒算法,类似且更难的题目。
public class Solution {
public String ReverseSentence(String str) {
char[] array = str.toCharArray();
if(array==null||array.length==0)
return "";
int start=0,end=array.length-1;
reverse(array,start,end);
end=0;
while(start<array.length){
if(array[start]==' '){// 如果开头是空格符
start++;
end++;
}
else if(array[end]==' '){//到空格了
reverse(array,start,end-1);
start=end+1;
end++;
}else if(end==array.length-1){// 到头了 得判断
reverse(array,start,end);
start=end+1;
end++;
}else
end++;
}
return new String(array);
}
public void reverse(char[] array,int start,int end){
while(start<end){
char tmp=array[start];
array[start]=array[end];
array[end]=tmp;
start++;
end--;
}
}
}
很费劲
可以用以下做法(考官指导可得)
String reverse(str){
String[] strr=str.split(" ");
StringBuilder sb=new StringBuilder();
for(int i=strr.length-1;i>=0;i--){
sb.append(strr[i]);
}
return sb.toString();
}
题目二
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路
同上题一样,把它分为两部分,前n个为第一部分,后面为第二部分,分别反转两部分然后再一起翻转一次,共三次。
public class Solution {
public String LeftRotateString(String str,int n) {
char[] array=str.toCharArray();
if(n<0||array==null||array.length==0||array.length<n)
return "";
reverse(array,0,n-1);
reverse(array,n,array.length-1);
reverse(array,0,array.length-1);
return new String(array); //
}
public void reverse(char[] array,int start,int end){
while(start<end){
char tmp=array[start];
array[start]=array[end];
array[end]=tmp;
start++;
end--;
}
}
}
- 字符串转数组
char[] array=str.toCharArray();
- 返回字符串:
return new String(array);
StringBuilder sb = new StringBuilder(chars.length);
for(char c:chars){
sb.append(c);
}
return sb.toString();
- 判断
if(n<0||arraynull||array.length0||array.length<n)
return “”; - 翻转字符串
public void reverse(char[] array,int start,int end){
while(start<end){
char tmp=array[start];
array[start]=array[end];
array[end]=tmp;
start++;
end--;
}