开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 27 天,点击查看活动详情
151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路
这道题乍一看我感觉基本没啥思路,只能想到反转字符串,但是他同时每个单词中字母的顺序时是正着的,所以就显得比较复杂。
看了题解后,明白了运用指针来解题,(其实这是之前的方法),知道了一个很巧妙地思路,先是把这个字符串整个反过来,然后在挨个寻找单词,把单词在一个一个返回去,这里就可以设置一个t来记录单词的一端,我们先让遍历时遇到空格就继续下一位,知道此时指向的不是空格了,就令t等于当前这个i,然后让这个i遍历到下一个空格之前,这两t和i之间就是一个单词了,于是我们在把这个单词的头尾写入reverse函数让他反转,就这样以此类推,不要忘记最后那个判断,这时防止数组越界的很重要的一行代码。
解法
class Solution {
public String reverseWords(String s) {
char[] arr=s.toCharArray();
reverse(arr,0,s.length()-1);
int k=0;
for(int i=0;i<arr.length;i++){
if(arr[i]==' '){
continue;
}
int t=i;
while(i<arr.length && arr[i]!=' ') i++;
for(int j=t;j<i;j++){
if(j==t){
reverse(arr,t,i-1);
}
arr[k++]=arr[j];
if(j==i-1){
if(k<arr.length) arr[k++]=' ';
}
}
}
if(k==0){
return "";
}else{
return new String(arr,0,(k==arr.length) && (arr[k-1]!=' ')?k:k-1);
}
}
public void reverse(char[] chars,int begin,int end){
for(int i=begin,j=end;i<j;i++,j--){
char t=chars[i];
chars[i]=chars[j];
chars[j]=t;
}
}
}