leetcode刷题:字符串04(颠倒字符串中的单词)

97 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

151.翻转字符串里的单词

力扣题目链接

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

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

这题一拿来,我看这不很简单吗

    public static String reverseWords(String s) {
        StringBuilder result = new StringBuilder("");
        s = s.trim();
        String[] strs = s.split(" ");
        for (int i = strs.length - 1; i > 0; i--) {
            //防止连续的空格
            if (!"".equals(strs[i])) {
                result.append(strs[i]).append(" ");
            }
        }
        //最后一位不加空格
        result.append(strs[0]);
        return String.valueOf(result);
    }

在这里插入图片描述

简单的看一下题解 在这里插入图片描述 所以最后为了让这题有意义,我按解题思路又做了一遍

package com.programmercarl.string;

/**
 * @ClassName ReverseWords
 * @Descriotion TODO
 * @Author nitaotao
 * @Date 2022/6/25 14:30
 * @Version 1.0
 * https://leetcode.cn/problems/reverse-words-in-a-string/
 * 151. 颠倒字符串中的单词
 **/
public class ReverseWords {
    public static void main(String[] args) {
        System.out.println(reverseWords("the sky is blue"));
    }
    /**
     * 不使用java内置的方法
     * 1 去除多于空格
     * 2 反转字符串
     * 3 反转单词
     *
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        StringBuilder result;
        //去除多余空格
        result = removeSpace(s);
        //反转整个字符串
        result = reverseStr(result, 0, result.length());
        //反转每个单词
        int start = 0;
        int end = 0;
        for (int i = 0; i < result.length(); i++) {
            if (result.charAt(end) == ' ') {
                result = reverseStr(result, start, end);
                end++;
                start = end;
            } else {
                end++;
            }
        }
        //反转最后一个单词
        result = reverseStr(result, start, result.length());
        return String.valueOf(result);
    }

    /**
     * 去除多余空格
     *
     * @param s
     * @return
     */
    public static StringBuilder removeSpace(String s) {
        StringBuilder result = new StringBuilder("");
        char[] strs = s.toCharArray();
        for (int i = 0; i < strs.length; i++) {
            //判断是否是首部的空格
            if (strs[0] == ' ' && i == 0) {
                continue;
            }
            //判断是否是中间多于的空格
            if (strs[i] == ' ' && strs[i - 1] == ' ') {
                continue;
            }
            result.append(strs[i]);
        }
        //判断最后一位是否是空格
        if (result.charAt(result.length() - 1) == ' ') {
            result.deleteCharAt(result.length() - 1);
        }
        return result;
    }

    /**
     * 反转指定区间内字符串
     *
     * @param s
     * @param start
     * @param end
     * @return
     */
    public static StringBuilder reverseStr(StringBuilder s, int start, int end) {
        while (start < end) {
            char temp = s.charAt(start);
            s.replace(start, start + 1, String.valueOf(s.charAt(end - 1)));
            s.replace(end - 1, end, String.valueOf(temp));
            start++;
            end--;
        }
        return s;
    }
}

在这里插入图片描述

虽然结果不太好看,但终究这题有意义了,不忘初心。