首页 > 其他分享 >力扣:151.反转字符串里的单词【2023年7月3日学习记录】

力扣:151.反转字符串里的单词【2023年7月3日学习记录】

时间:2024-07-03 19:26:57浏览次数:27  
标签:151 单词 -- initialArr 力扣 2023 字符串 world 指针

 方法一:双指针

1.先使用trim()方法删除单词字符串前后空格字符。

2.用两个指针指向字符串末尾单词(一个快指针,一个慢指针),快指针先向前移动,直到移动到空格字符停下来,然后截取从快指针到慢指针的单词到新开辟的字符串中。

3.快指针再向前移动一位,同时将慢指针指向到快指针的位置,再重复第二步的操作,直到遍历完整个字符串。

4.最后输出截取出的字符串数组。

例如:

"  hello world  "

1.先使用trim()方法删除单词字符串前后空格字符。

s1="  hello world  "-->s1="hello world"

2.用两个指针指向字符串末尾单词(一个快指针,一个慢指针),快指针先向前移动,直到移动到空格字符停下来,然后截取从快指针到慢指针的单词到新开辟的字符串中。

s1="hello world"-->s1="hello world"     ,new s2="world"

                       ij                    i        j 

3.快指针再向前移动一位,同时将慢指针指向到快指针的位置,再重复第二步的操作,直到遍历完整个字符串。

-->s1="hello world"     -->       s1="hello world"

                  ij                                  i      j

s2="world hello"

代码实现:

 public String reverseWords(String s) {
                //双指针
                s=s.trim();
                int j=s.length()-1,i=j;
                StringBuilder s1=new StringBuilder();
                while(i>=0) {
                    while(i>=0&&s.charAt(i)!=' ')i--;
                    s1.append(s.substring(i+1,j+1)+' ');
                    while(i>=0&&s.charAt(i)==' ')i--;
                    j=i;
                }
                String s2=s1.toString().trim();
                return s2;
            }

方法二:字符串双反转+移位

1.首先将整体字符串都翻转过来

“  hello world "  -->"  dlrow olleh "

2.然后从第一个字符开始向前遍历,从第一个字符开始向前遍历,将第每个单词进行翻转,每翻转一个单词后就进行移位,移位置的操作是为了删除空格字符。

第一个单词翻转:"  dlrow olleh "-->"  world olleh  "    

移位操作:

  "  world olleh  "-->"w world olleh  "

-->"woworld olleh  "-->"wororld olleh  "

-->"worlrld olleh  "-->"worldld olleh"

3.同理对后面的单词进行相同操作:

最终得到:-->"world hello"

代码实现:

//解法三:双反转+移位,String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组,空间复杂度:O(n)
class Solution {
    /**
     * 思路:
     *	①反转字符串  "the sky is blue " => " eulb si yks eht"
     *	②遍历 " eulb si yks eht",每次先对某个单词进行反转再移位
     *	   这里以第一个单词进行为演示:" eulb si yks eht" ==反转=> " blue si yks eht" ==移位=> "blue si yks eht"
     */
    public String reverseWords(String s) {
        //步骤1:字符串整体反转(此时其中的单词也都反转了)
        char[] initialArr = s.toCharArray();
        reverse(initialArr, 0, s.length() - 1);
        int k = 0;
        for (int i = 0; i < initialArr.length; i++) {
            if (initialArr[i] == ' ') {
                continue;
            }
            int tempCur = i;
            while (i < initialArr.length && initialArr[i] != ' ') {
                i++;
            }
            for (int j = tempCur; j < i; j++) {
                if (j == tempCur) { //步骤二:二次反转
                    reverse(initialArr, tempCur, i - 1);//对指定范围字符串进行反转,不反转从后往前遍历一个个填充有问题
                }
                //步骤三:移动操作
                initialArr[k++] = initialArr[j];
                if (j == i - 1) { //遍历结束
                    //避免越界情况,例如=> "asdasd df f",不加判断最后就会数组越界
                    if (k < initialArr.length) {
                        initialArr[k++] = ' ';
                    }
                }
            }
        }
        if (k == 0) {
            return "";
        } else {
            //参数三:以防出现如"asdasd df f"=>"f df asdasd"正好凑满不需要省略空格情况
            return new String(initialArr, 0, (k == initialArr.length) && (initialArr[k - 1] != ' ') ? k : k - 1);
        }
    }

    public void reverse(char[] chars, int begin, int end) {
        for (int i = begin, j = end; i < j; i++, j--) {
            chars[i] ^= chars[j];
            chars[j] ^= chars[i];
            chars[i] ^= chars[j];
        }
    }
}

标签:151,单词,--,initialArr,力扣,2023,字符串,world,指针
From: https://blog.csdn.net/2303_81066780/article/details/140155781

相关文章

  • 151.翻转字符串里的单词 卡码网:55.右旋转字符串
    151.翻转字符串里的单词卡码网:55.右旋转字符串 151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode) Code:classSolution{public:  stringreverseWords(strings){​    //单词级翻转,而不是单词内翻转  ​......
  • 力扣刷题之旅——21. 合并两个有序链表
    I理解题目需求II设计程序(参考:Violent-Ayang)III程序解析IV 程序相关知识点1.结构体(struct):2.指针(*):3.循环(while)和条件语句(if和else):I理解题目需求1.合并两个已经是升序排列的链表2.将它们合并为一个新的、也是升序排列的链表。3.合并后的链表需要包含两个输入......
  • YOLOv8改进 | 卷积模块 | 减少冗余计算和内存访问的PConv【CVPR2023】
    秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 ......
  • 力扣每日一题 7/2 数学、数论、数组/双指针
    博客主页:誓则盟约系列专栏:IT竞赛专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、
    原题链接题目描述给你一个整数数组nums。返回两个(不一定不同的)质数在nums中下标的最大距离。示例1:输入:nums=[4,2,9,5,3]输出:3解释:nums[1]、nums[3]和nums[4]是质数。因此答案是|4-1|=3。示例2:输入:nums=[4,8,2,8]输出:0解释:nums[2]是质......
  • 【漏洞复现】LiveGBS user/save 逻辑缺陷漏洞(CNVD-2023-72138)
    0x01产品简介LiveGBS是安徽青柿信息科技有限公司研发的一款国标(GB28181)流媒体服务软件,可提供提供用户管理及Web可视化页面管理,开源的前端页面源码;提供设备状态管理,可实时查看设备是否掉线等信息等。0x02漏洞概述LiveGBSuser/save接口处存在逻辑缺陷漏洞,未经身份验......
  • 复旦大学2023--2024学年第二学期高等代数II期末考试情况分析
    一、期末考试成绩班级前几名的同学施想(95)、侯煜天(94)、刘升(92)、洪临依(92)、王龙晨(92)、文俊(90)、徐亦闵(89)、邓海斌(89)、褚乐一(89)二、总评成绩计算方法作业成绩根据交作业的次数决定。本学期提交作业共13次,10次100分,少1次扣10分。总评成绩=作业成绩*15%+期中成绩*......
  • 中国人工智能行业应用发展图谱2023
    易观分析近日发布了一份名为《中国人工智能行业应用发展图谱2023》的研究报告,这份报告深入分析了中国人工智能行业的发展现状、趋势以及未来的应用场景。报告指出,随着技术的不断进步和政策的支持,人工智能在各个领域的应用越来越广泛,从智能制造、医疗健康到教育、交通等,人......
  • 2023年中国中老年市场白皮书:中老年服务及产品“人-货-场“解析
    近日,CIC灼识咨询联合量子之歌发布了《2023年中国中老年市场白皮书——中老年服务及产品"人-货-场"三维解析》报告。该报告深入剖析了中国中老年市场的现状与发展潜力,从消费者需求、产品供给、购买渠道三个维度进行了全面分析,揭示了中老年群体在日用品、医养服务、保健消费以......
  • 复旦大学2023--2024学年第二学期(23级)高等代数II期末考试第七大题解答
    七、(10分) 设$V$是$n$阶实矩阵全体构成的实线性空间, $A$是$n$阶正定实对称阵.对任意的$X,Y\inV$,定义二元函数$(X,Y)=\mathrm{tr}(XAY')$.(1)求证:$(-,-)$是$V$上的一个内积.(2)在上述内积下,$V$成为一个欧氏空间. 设$P,Q\inV$,$V$上的线性算子$......