首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道leetcode151-反转字符串里的单词

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

作者头像
乔戈里
发布2019-09-17 15:05:32
6040
发布2019-09-17 15:05:32
举报
文章被收录于专栏:Java那些事Java那些事Java那些事

昨天的题解

题目

每天一道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了
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 题目详述
  • 题目详解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档