面试题:翻转字符串
题目一:翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但是单词内字符的顺序不变(标点符号和普通字母一样处理)
题目二:左旋转字符串
把字符串前面的若干个字符转移到字符串的尾部(如输入abcdefg和2,输出cdefgab)
思路:
题目一:
java中可用split函数将字符串转化为字符数组,因此将英文句子用空格分割为字符数组后,再将数组进行翻转即可
书中的思路是:先将句子整体翻转,再用空格作为终止符来识别单词,并将单词进行翻转,用此思路更好衔接第二题
题目二:
将字符串分为两个部分,分为旋转位置前的位置和旋转位置后的位置,可先分别旋转两个部分,再对字符串整体进行翻转
即ab | cdefg 先分别翻转为—— ba | gfedc ;再整体翻转为 cdefg | ab 即我们想要得到的部分
代码:
题目一的简单思路和书中思路分开写的
// 简易思路 但不宜衔接题目二
// 未加入null判断
public class Q58_1 {
public static void main(String[] args) {
String s = "I am such a good student.";
String re = reverse(s);
System.out.println(re);
}
public static String reverse(String s) {
String[] slist = s.split(" ");
for(int i=0;i<slist.length/2;i++) {
String temp = slist[i];
slist[i]=slist[slist.length-i-1];
slist[slist.length-i-1] = temp;
}
String re = "";
for(int i=0;i<slist.length;i++) {
if(i!=0) {
re = re + " " + slist[i];
}else {
re = re + slist[i];
}
}
return re;
}
}
public class Q58_1 {
public static void main(String[] args) {
String s = "I am a good student.";
String re = reverSen(s);
System.out.println(re);
}
// 先旋转字符串的部分,再根据空格为终止符来单独对每个单词进行翻转
public static String reverSen(String s) {
if(s!=null && s.length()>0) {
s = reverse(s, 0, s.length()-1);
int start = 0;
for(int i=1;i<s.length();i++) {
if(s.charAt(i)==' ') {
s = reverse(s, start, i-1);
start = i+1;
}
}
return s;
}
return null;
}
// 旋转字符串的部分
public static String reverse(String s, int start, int end) {
char[] clist = s.toCharArray();
while(start<end) {
char temp = clist[start];
clist[start]=clist[end];
clist[end] = temp;
start++;
end--;
}
s = new String(clist);
return s;
}
}
题目二:
public class Q58_2 {
public static void main(String[] args) {
String s = "abcdefg";
String re = leftRever(s,2);
System.out.println(re);
}
public static String leftRever(String s,int loc) {
if(s!=null && s.length()>0) {
s = reverse(s, 0, loc-1);
s = reverse(s, loc, s.length()-1);
s = reverse(s, 0, s.length()-1);
return s;
}
return null;
}
public static String reverse(String s,int start, int end) {
if(s!=null && s.length()>0) {
char[] clist = s.toCharArray();
while(start<end) {
char temp = clist[start];
clist[start] = clist[end];
clist[end] = temp;
end--;
start++;
}
String re = new String(clist);
return re;
}
return null;
}
}