题目描述
题目一
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
为简单起见,标点符号和普通字母一样处理。
例如输入字符串"I am a student."
,则输出"student. a am I"
。
题解:java中对字符串的一系列操作还是超级方便的。
知识储备:
1)String的一些基本操作 String s=" ";
1.1)s.trim();删除字符串两端的空格;1.2)s.split("\\s+"); 表示按照空格,回车,换行等空白符,截取字符串 ;+表示多个
1.3) s.substring(1, s.length() - 1);//字符串截取,范围左闭右开
2)StringBuilder的一些基本操作 StringBuilder ss=new StringBuilder();
2.1) ss.append("%20"); 添加 2.2)ss.toString();//将StringBuilder转为string
public class Solution {
public String ReverseSentence(String str) {
if(str.trim().equals("")){
return str;
}
String[] a = str.split(" ");
StringBuffer o = new StringBuffer();
int i;
for (i = a.length; i >0;i--){
o.append(a[i-1]);
if(i > 1){
o.append(" ");
}
}
return o.toString();
}
}
题目二
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。
比如输入字符串"abcdefg"
和数字2,该函数将返回左旋转2位得到的结果"cdefgab"
。
题解:使用StringBuilder的基本函数操作较为简单
public class Solution {
public String LeftRotateString(String str,int n) {
if (str == null || n < 0 || n > str.length()) return str;
StringBuilder ss = new StringBuilder(str);
ss.append(ss.substring(0, n));
return ss.substring(n, sb.length());
}
}
利用翻转字符串的思路:以“abcdefg”为例,将这个字符串分为两个部分,假设n=2
1)把前两个字符分到第一部分,把后面的所有字符分到第二部分;
2)分别翻转这两部分字符,得到bagfedc
3)翻转得到的字符串,得到cdefgab 就是将原始字符串左旋转两位的结果
public class Solution {
public String LeftRotateString(String str,int n) {
char[] chars = str.toCharArray();
if(chars.length < n) return "";
reverse(chars, 0, n-1);//翻转第一部分
reverse(chars, n, chars.length-1);//翻转第二部分
reverse(chars, 0, chars.length-1);//翻转整个字符串
StringBuilder s = new StringBuilder(chars.length);
for(char c:chars){
s.append(c);
}
return s.toString();
}
public 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--;
}
}
}