题目链接: JZ73 翻转单词序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如, “nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
数据范围:1
≤
\le
≤ n
≤
\le
≤ 100
进阶:空间复杂度 O(n) ,时间复杂度 O(n) ,保证没有只包含空格的字符串
示例:
输入:“nowcoder. a am I”
输出:“I am a nowcoder.”
题目分析:首先分析示例,观察到,字符串翻转,但每个单词内部并没有翻转,所以,我们可以先整体翻转字符串,然后再将每个单词翻转回来。根据以上思路编写代码,code如下:时间复杂度 O(n),空间复杂度 O(n)
public class Solution {
public String ReverseSentence(String str) {
//思路:整体反转,再反转每一个单词
//字符串转为数组
char[] chars = str.toCharArray();
//整体反转字符串
reverse(chars,0,chars.length-1);
int block = -1;
int nextblock = -1;
for(int i=0;i<chars.length;i++){
//注意这里是‘ ’ 而不是“ ”
if(chars[i] == ' '){
nextblock = i;
reverse(chars,block+1,nextblock-1);
block = nextblock;
}
}
//处理最后一个单词(❤)
reverse(chars, block+1,chars.length-1);
return new String(chars);
}
public void reverse(char[] chars, int start, int end){
while(end>start){
char temp = chars[start];
chars[start] = chars[end];
chars[end]= temp;
start++;
end--;
}
}
}
② 可以将每一个字符存储到数组或栈中,然后依次添加至StringBuffer中,重点处理添加空格情况。时间复杂度O(n),空间复杂度O(n)
public class Solution {
public String ReverseSentence(String str) {
//思路:①排除空字符串的可能 采用StringBuffer添加字符串
//排除字符串前后空格,字符串长度为0
if(str.trim().length()==0){
return str;
}
StringBuffer sb = new StringBuffer();
//将每一个单词存储在String[]数组中
String[] s = str.trim().split(" ");
//从后往前遍历字符串
for(int i=s.length-1;i>=0;i--){
if(s[i]!=" "){
sb.append(s[i]);
}
if(i>0){
sb.append(' ');
}
}
return sb.toString();
}
}
总结:
字符串中的trim():除字符串前后空格部分
" ":空格字符串
’ ':空格字符