【剑指Offer】58-1.翻转单词顺序(java)

 LeetCode/剑指Offer/翻转单词顺序

剑指Offer其他题目代码

【思路】

1.将整个字符串分成形如"ab"结构的子串。
  其中,a是由" "组成的,可以为空;b是由非空格的其他字符组成的,也可以为空。
    例如字符串" hello world   !!! "
    可以分成" ","hello ","world   ","!!! "这样四个子串。
2.逆序迭代,将每一个子串去掉尾巴的空格后,一一加入StringBuilder的变量中。
    例如"!!! "子串,去掉空格:"!!!"
3.因为单词之间需要用" "隔开,所以每一个子串加入的时候,要在后面缀上一个" ",
  这样,整个字符串翻转完成后,末尾会多余出一个" ",切掉。    

另:也可以用split分割字符串为字符串数组,但是耗时长,见代码2

【举例】

(因为csdn只能上传不超过5M的动图,所以只能上传这个有点模糊的,哭唧唧QAQ)

题解

【代码1】

class Solution {
    public String reverseWords(String s) {

        if (s.length() == 0) return "";

        char[] st = s.toCharArray();
        StringBuilder res = new StringBuilder();

        for (int i = s.length() - 1, j = i; i >= 0 && j >= 0; ) {
            //越过空格
            while (j >= 0 && st[j] == ' ') {//循环后,j保存子串最后一个非空字符的位置
                j--;
            }

            if (j < 0)
                break;

            i = j;

            while (j >= 0 && st[j] != ' ') {//循环后,j保存子串第一个非空字符的下一个位置
                j--;
            }

            //i:结束的位置
            //j+1:开始的位置
            //i-j:子串长度
            res.append(st, j + 1, i - j).append(" ");
        }

        //如果字符串只包含' ',返回""
        return res.length() == 0 ? "" : res.substring(0, res.length() - 1);
    }      
}

【代码2】

class Solution {
    public String reverseWords(String s) {
        if (s == null || s.length() == 0)
            return "";

        String[] st = s.trim().split("\\s+");
        StringBuilder builder = new StringBuilder();
        int len = st.length;
        for (int i = len - 1; i >= 0; i--) {
            builder.append(st[i] + " ");
        }
        builder.deleteCharAt(builder.length() - 1);
        return builder.toString();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值