­

每天一道leetcode151-反转字符串里的单词

  • 2019 年 10 月 4 日
  • 筆記

昨天的题解

题目

每天一道leetcode151-反转字符串里的单词 分类:字符串

题目详述

给定一个字符串,逐个翻转字符串中的每个单词。

示例:

输入: "the sky is blue", 输出: "blue is sky the". 说明:

无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

题目详解

思路

  • 见到这道题,我第一思想就是先剔除掉空格,然后反转整个字符串,abc hef反转完就是feh cba 然后在依次反转每个字符串feh反转完就hef cba反转完就是abc,然后连接起来就是def abc完成反转
  • 剔除空格的思路,是先剔除首部和尾部的空格,然后对于中间的空格,找到的话只添加一个空格,直到找到下一个单词;abc def(隔了3个空格),abc不是空格,就加到result字符串里,然后直到了第一个空格,result就加一个空格,然后循环一直往下遍历,直到找到不是空格的d然后再把d加到字符串里面(ef不是空格也依次加到result里面),最后就得到了abc def剔除掉了空格

代码(安卓机代码可以移动,苹果机不行,最近我在寻找一个新的代码排版,PC端打开没有问题)

先放个图片,代码排版有问题的看图片

test.png

public class Solution {      public String reverseWords(String s) {          if(s.equals(""))              return s;          if(s.equals(" "))              return "";          s = deleteSpace(s);          s = reverse(s);          String [] list = s.split(" ");          String result = "";          for(int i=0;i<list.length-1;i++)          {              result += reverse(list[i]) + " ";          }          result += reverse(list[list.length - 1]);          return result;      }      public String reverse(String s)      {          char [] charArray = s.toCharArray();          int i=0;int j=charArray.length - 1;          while(i < j)          {              char temp = charArray[i];              charArray[i] = charArray[j];              charArray[j] = temp;              i++;              j--;          }          return String.valueOf(charArray);      }      public String deleteSpace(String s1) {          char [] charArray = s1.toCharArray();          int begin = 0;int end = s1.length() - 1;          while(begin < charArray.length && charArray[begin] == ' ')              begin++;          while(end >= 0 && charArray[end] == ' ')              end--;          String temp = "";          while (begin <= end)          {              if(charArray[begin] != ' ')              {                  temp += charArray[begin];                  begin++;              }else {                  temp += ' ';                  while (charArray[begin] == ' ')                  {                      begin++;                  }              }          }          return temp;      }  }  

代码讲解

  • 32-55行就是思路上说的剔除空格的实现。
  • 18-31行就是反转字符串
  • 7-8行就是先剔除空格,然后反转字符串,11-14行就是对于每个字符串都依次反转,然后拼接起来

结果

结果.png 超时了尴尬

AC代码

public class Solution {      public String reverseWords(String s) {          if (s == null || s.length() == 0) {              return "";          }          String[] array = s.split(" ");          String str = "";          for (int i = array.length - 1; i >= 0; --i) {              if (!array[i].equals("")) {                  if (str.length() > 0) {                      str += " ";                  }                  str += array[i];              }          }          return str;      }  }  

代码讲解

  • 不AC就换种思路,不反转字符串了!
  • 6行先按照“ ”空格分开(这个很强,会把所有的空格变成一个“”空字符串!,然后把一个个单词分开,abc dgh fgh 分成abc和dgh和fgh)
  • 然后从后往前依次遍历,9行就是判断是不是空白字符串,因为split会把空格变成空字符串。所以会把空白字符串跳过!
  • 13行就是不是空字符串加上分开的字符串,(abc和dgh和fgh这些)
  • 最后AC了