题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内部的顺序不变。为简单起见 ,标点符号和普通字母一样处理。例如输入字符串”I am a student. ”,则输出”student. a am I”。
这是一道经典的算法题,使用两次翻转即可实现。我们能很顺畅的给面试官解释:第一次对整个字符串进行翻转,得到:“.stneduts a ma I”;第二次对单个字符串进行翻转,得到:“students. a am I”。
实现代码:
private static String ReverseSentence(String sentence){
if(sentence==null||sentence.length()==0){
throw new RuntimeException("sentence==null||sentence.length()==0");
}
char[] chs = sentence.toCharArray();
//第一次字符串整体逆序
Reverse(chs, 0, chs.length-1);
//第二次对字符串中单个单词进行逆序,单词直接分界就是空格
int wordStart=0,wordEnd=0;
char temp=chs[wordEnd];
while(wordEnd<chs.length){
if(chs[wordEnd]==' '){
Reverse(chs, wordStart, wordEnd-1);
wordEnd++;
wordStart = wordEnd;
}
wordEnd++;
}
return new String(chs);
}
private static void Reverse(char[] chs,int left,int right){
while(left<right){
char temp=chs[left];
chs[left]=chs[right];
chs[right]=temp;
left++;
right--;
}
}
题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串”abcdefg"和数字 2,该函数将返回左旋转 2 位得到的结果”cdefgab”。
题目二与题目一的关联是比较大的,完成这题我们需要进行三步翻转。以字符串“abcdefg”为例,第一次翻转前2位,即“ab”,得到”bacdefg”;第二次翻转后面的所有字符,得到“bagfedc”;第三次翻转整个字符串,得到“cdefgab”。
实现代码:
private static String LeftRotateString(String str,int n){
if(str==null||str.length()==0||n<0){
throw new RuntimeException("str==null||str()==0");
}
char[] chs = str.toCharArray();
Reverse(chs, 0, n-1);
Reverse(chs,n,chs.length-1);
Reverse(chs,0,chs.length-1);
return new String(chs);
}