题目一:翻转单词顺序
输入一个英文句子,翻转句子中单词顺序,但单词内字符的顺序不变。
为简单起见,标点符号和普通字母一样处理。
例如输入I am a student. 则输出student. a am I
思路一:
将字符串按照一个空格分割,反向重新组合字符串
public static String ReverseSentence(String str) {
//.trim()去掉字符串两端多余的空格
if(str==null || str.length()==0 || str.trim().length()==0)
return str;
String result="";
String[] strs = str.split(" ");
int len = strs.length;
for(int i=len-1;i>=0;i--)
result += strs[i]+" ";
result = result.substring(0,result.length()-1);
return result;
}
思路二:
1.先翻转整个句子,然后再依次翻转每个单词
2.依据空格来确定单词的起始和终止位置
public String ReverseSentence1(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);
}
public void reverse(char[] chars,int low,int high) {
while(low<high) {
char temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}
题目二:左旋转字符串
- 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
- 请定义一个函数实现字符串左旋转操作的功能。
- 比如。输入字符串abcdefg和在,该函数将返回左旋转两位得到的结果cdefgab
方法一:
每个字符都需要移动数组的长度-1,如果数组的长度是n,需要移k位,则总共需要移动 k * (n - 1)
public static String leftRotateString(String str,int n) {
if(str.isEmpty())
return str;
if(n<0||n>=str.length())
return str;
char[] strArray = str.toCharArray();
while(n-- >0) {
for(int i=0;i<strArray.length-1;i++) {
swap(strArray,i,i+1);
}
}
return new String(strArray);
}
private static void swap(char[] str,int i,int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
方法二:
先翻转第一部分,再翻转第二部分,最后整体翻转
public static void reverse(char[] c,int start,int end) {
char temp;
while(start<end) {
temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
}
public static String leftRotateString1(String str,int n) {
if(str==null || str.trim().length()==0)
return str;
char[] c = str.toCharArray();
if(n>0 && n<str.length() && str.length()>0) {
reverse(c,0,n-1);
reverse(c,n,c.length-1);
reverse(c,0,c.length-1);
}
return String.valueOf(c);
}