字符串——4.力扣题目:151. 反转字符串中的单词

该文章介绍了一个Java程序,用于在不使用额外空间且保持空间复杂度为O(1)的情况下,反转给定字符串中的单词顺序。主要分为三步:去除多余空格,反转整个字符串,然后反转每个单词。代码中详细展示了这三个步骤的方法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

解析(不使用辅助空间,而且空间复杂度为O(1))

题目要求:给你一个字符串 s ,请你反转字符串中 单词 的顺序。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

大体思路:分三步:

①去除多余空格

②反转整个字符串:可以使得整个字符的反转,虽然使得单词内的字符顺序反了,但是单词与单词之间的顺序实现反转

③按照单词反转字符串:对单词进行反转,这样反反得正。

具体做法:

按照上述的三步,写成三个方法。因为步骤③会复用步骤②的代码。

注意点:(用于判断的语句的顺序有讲究)

①判断的语句的顺序:如代码中的注释所示

②StringBulider.setCharAt(int i, char c) 将第i个代码单元设置为c

③StringBulider.charAt(int i)查找i处的字符

代码:
class Solution {
    public String reverseWords(String s) {
        StringBuilder str = new StringBuilder();
        str = removeBlank(s);
        reverseString(0, str.length() - 1, str);
        reverseEachWord(str);
        return str.toString();
    }
    // 去除空格
    public StringBuilder removeBlank(String s) {
        StringBuilder str = new StringBuilder();
        int left = 0, right = s.length() - 1;
        while (s.charAt(left) == ' ') left++;
        while (s.charAt(right) == ' ') right--;
        while (left <= right) {
            if (s.charAt(left) != ' ' || s.charAt(left + 1) != ' ') str.append(s.charAt(left));
            left++;
        }
        return str;
    }
	// 反转一段字符
    public void reverseString(int start, int end, StringBuilder str){
        while (start < end) {
            char temp = str.charAt(start);
            str.setCharAt(start,str.charAt(end));
            str.setCharAt(end, temp);
            start++;
            end--;
        }
    }
    // 反转每一个单词
    public void reverseEachWord(StringBuilder str){
        int start = 0, end = 0;
        while(end <= str.length()) {
            // 注意这个||前后顺序不能错,否则当end == length时,先判断charAt()会溢出报错
            if (end == str.length() || str.charAt(end) == ' ' ) {
                reverseString(start, end - 1, str);
                end++;
                start = end;
            } else {
                end++;
            }
        }
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值