当前位置: 首页 > article >正文

代码随想录算法训练营第十四天(2)|151.翻转字符串里的单词

文档讲解:代码随想录

难度:easy

附:冲

passion!!!passion!!!passion!!!

 151.翻转字符串里的单词

力扣题目链接(opens new window)

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

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

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

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

思路

  1. 首先将获取的参数赋值给一个数组,再创建c一个用来返回的数组(多出来的一个位置是为了在添加单词时,每个单词后面可以添加一个空格。最终,末尾的空格不会被返回。)、
  2. 创建一个指newArrPos 针,用于跟踪新字符数组 newArr 的当前位置。初始值为 0,表示从 newArr 的第一个位置开始填充。
  3. i来进行整体对源字符数组从后往前遍历
  4. 进入循环:如果是空i--,否则记录当前索引值然后如果不是空i--
  5. 提取单词(用到了right为临界)
  6. 最后如果为空,则返回空,否则通过 String(newArr,0,newArrPos-1)来提取newArr 中有效部分(即反转后的单词序列),并去掉最后一个多余的空格。

补充

String(newArr, 0, newArrPos - 1) 这行代码的作用是从字符数组 newArr 中创建一个新的字符串。它的参数含义如下:

  1. newArr: 这是源字符数组,包含了反转后的单词以及每个单词后面的空格。

  2. 0: 这是起始索引,表示从 newArr 的第 0 个位置开始创建字符串。

  3. newArrPos - 1: 这是结束索引,表示字符串的结束位置是 newArrPos - 1

具体作用

  • 这行代码的目的是从 newArr 中提取有效部分(即反转后的单词序列),并去掉最后一个多余的空格。

  • newArrPos 是 newArr 的当前填充位置,指向最后一个有效字符的下一个位置。

  • 由于每个单词后面都添加了一个空格,newArrPos - 1 会去掉最后一个单词后面的空格。

代码

class Solution {
    public String reverseWords(String s) {
        //源字符数组
        char[] initialArr = s.toCharArray();
        //新字符数组
        char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
        int newArrPos = 0;
        //i来进行整体对源字符数组从后往前遍历
        int i = initialArr.length-1;
        while(i>=0){
            while(i>=0 && initialArr[i] == ' '){i--;}  //跳过空格
            //此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
            int right = i;
            while(i>=0 && initialArr[i] != ' '){i--;} 
            //指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
            for (int j = i+1; j <= right; j++) {
                newArr[newArrPos++] = initialArr[j];
                if(j == right){
                    newArr[newArrPos++] = ' ';//空格
                }
            }
        }
        //若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
        if(newArrPos == 0){
            return "";
        }else{
            return new String(newArr,0,newArrPos-1);
        }
    }
}


http://www.kler.cn/a/596490.html

相关文章:

  • 一个完整的小项目案例,涉及到项目的规划,模块的设计功能的衔接等。
  • “智改数转”新风口,物联网如何重构制造业竞争力?
  • 996引擎-接口测试:音效测试NPC
  • 1、环境初始化--Linux安装dockerCE
  • OpenCV Calib3d 模块使用指南
  • 科学计算库:Numpy
  • 3389远程桌面爆破
  • 破解内存瓶颈:如何通过内存池优化资源利用
  • Cannon.js 物理引擎入门(Three.js 结合 Cannon.js)
  • Android10 系统截屏功能异常的处理
  • python每日十题(5)
  • HTML超链接
  • 网络层之IP协议
  • 网络HTTPS协议
  • 从碎片化到标准化:案例详解 MCP 如何重塑 AI Agent 开发生态?
  • WEBUI插件和UE5通讯
  • 爬虫——playwright获取亚马逊数据
  • 2025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构
  • 清洁机器人垃圾物识别与智能分类回收系统研究(大纲)
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折