字符串反转巧妙处理、拼接、空格的跳跃处理-151. 反转字符串中的单词

题目链接及描述

151. 反转字符串中的单词 - 力扣(LeetCode)

题目分析

        今天又遇到了曾经做过的题目,对于这道题目,曾经做过几遍了,即使之前做过,今天又遇到这道题目时,对于边界的处理仍然不够完善,浪费了不少的时间。

        根据题目描述分析如下:

  • 去除字符串的前置空格。
  • 去除字符串的尾置空格。
  • 将字符串中各个单词之间的空格仅保留一个,去掉字符串中单词间的多余空格。
  • 将字符串中单词反转。【之前有道题目不仅仅需要将单词互相反转,同时需要单词内部也反转,只要掌握了这道题目的写法,在基础上对每个单词反转即可

        对于去除字符串前置以及尾置空格,非常容易处理,只需要循环不断移动指针的位置,随后进行字符串截取得到新字符串,即可完成,参考如下:

        int len = s.length() - 1;
        while(s.charAt(len) == ' '){
            --len;
        }
        int slow = 0;
        while(s.charAt(slow) == ' '){
            ++slow;
        }
        String temp = s.substring(slow, len + 1);

         对于去除字符串间的多余空格,此博客编写了一个非常巧妙的方法,具体见代码处理。通俗易懂。

        String temp = s.substring(slow, len + 1);
        len = temp.length();
        String ans = "";
        slow = 0;
        for(int fast = 0; fast <= len; fast++){
            if(fast == len || temp.charAt(fast) == ' '){
                if(fast > slow){
                    // 仅当遇到新的单词需要拼接时,才会进入此if中
                    String str = temp.substring(slow, fast);
                    if(slow != 0){
                        str = str + " ";
                    }
                    ans = str + ans;
                }
                // 去除字符串单词间的空格
                slow = fast + 1;
            }
        }
        return ans;

        关于为什么需要满足fast > slow时,才说明遇到了新的单词:

 

        遍历到第一个单词word时,此时fast指针指向word单词后的第一个空格,随后将slow = fast + 1,slow指向了fast指针的后一个位置,如果单词间仅有一个空格,此时fast指针对应的单词为非空格,继续遍历,不会进入字符串提取操作。然后此时单词间有两个空格,fast对应的字符满足if条件,再次进入单词提取操作,然后此时并不需要提取单词,同时此刻fast = slow。不需要提取。只有满足fast > slow也就是说fast和slow之间存在字符,此时才提取单词。

        同时对于单词的反转,采用的是逆向拼接每一个单词的方式,如果是第一个单词,则提取后的单词不需要加空格,如果非第一个单词,则提取后的单词需要加空格,,这样操作,保证了每一个单词间有一个空格,如果需要每一个单词间若干个空格,或者若干特定的字符,只需要将空格替换即可。

        同时slow = fast + 1,只能放置在if(fast > slow)判断条件外面,只有这样,才能够保证每次提取新单词时,slow对应的位置均为单词的起始下标。

代码编写

class Solution {
    public String reverseWords(String s) {
        int len = s.length() - 1;
        while(s.charAt(len) == ' '){
            --len;
        }
        int slow = 0;
        while(s.charAt(slow) == ' '){
            ++slow;
        }
        String temp = s.substring(slow, len + 1);
        len = temp.length();
        String ans = "";
        slow = 0;
        for(int fast = 0; fast <= len; fast++){
            if(fast == len || temp.charAt(fast) == ' '){
                if(fast > slow){
                    String str = temp.substring(slow, fast);
                    if(slow != 0){
                        str = str + " ";
                    }
                    ans = str + ans;
                }
                slow = fast + 1;
            }
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pikachu靶场(命令执行(RCE)通关教程)

第1关 exec "ping" 1.打开网站 看到一个ping的字样&#xff0c;想到这里应该是要写一个IP地址&#xff0c;这里用本地回环地址 可以看到返回了&#xff0c;根据返回的TTL值&#xff0c;猜想到这里应该是Windows 使用命令可以观看之前写的博客。 所以直接写入127.…

Ubuntu20.04.6操作系统安装教程

一、VMware Workstation16安装 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;链接如下&#xff1a; 下载 VMware Workstation Pro 下载后运行安装向导&#xff0c;一直Next即可。 二、Ubuntu镜像下载 ubuntu20.04 选择需要下载的镜像类型下载即…

git 如何撤销已经 push 的 merge

今天在合并代码时, 发现自己失误把另外一个分支 B 的代码合并到了自己分支 C, 于是想到要撤销这次 merge 一般地, 如果我们想要撤销某次 commit 可以 git revert <commit-id>. 然而, 对于 merge 类型的 commit 不能直接 git revert <commit-id> 这里举个例子: 我…

[vue2]深入理解vuex

本节内容 概述初始化仓库定义数据访问数据修改数据处理异步派生数据模块拆分案例-购物车 概述 vuex是一个vue的状态管理工具, 状态就是数据 场景 某个状态在很多个组件使用 (个人信息)多个组件 共同维护 一份数据 (购物车) 优势 数据集中式管理数据响应式变化 初始化仓库 …

如何降低pcdn的延迟?

要降低P2P CDN的延迟&#xff0c;可以采取以下操作&#xff1a; 一&#xff0e;优化网络连接&#xff1a; 1、使用有线网络连接替代无线连接&#xff0c;因为有线连接通常提供更稳定的数据传输。 2、升级家庭或企业路由器&#xff0c;选择性能更好的路由器以提高网络传输速度…

ant-design-vue 的modal.confirm突然无法自动关闭

这个是我当前的版本 &#xff0c;点击不能 关闭&#xff0c; 版本的问题 修改 &#xff1a; "vue": "~3.2.0", 重新下包就ok了 参考 &#xff1a; antdesign的modal.confirm突然无法自动关闭_antdesign confirm点击后不关闭-CSDN博客

基于WPF技术的换热站智能监控系统03--实现左侧加载动画

1、左侧布局规划 左侧分5行&#xff0c;每行的高度通过height属性来指定&#xff0c;1.2*表示占1.2倍的宽度 2、创建用户控件 在WPF中想要进行个性化处理&#xff0c;主要可以通过三个方面来实现&#xff1a;控件模板&#xff08;控件模板、数据模板、数据容器模板&#xff09…

python学习 -You-Get视频下载使用案例

You-Get 是一个命令行程序&#xff0c;提供便利的方式来下载网络上的媒体信息。 You-Get 是一个用于从网页下载媒体内容&#xff08;如视频、音频、图片&#xff09;的Python库。它支持多种网站&#xff0c;能够捕获并下载这些网站中直接或间接提供的媒体资源。You-Get 的设计…

2024年金融、贸易与创意产业国际会议(ICFTCI 2024)

2024 International Conference on Financial Trade and Creative Industries 【1】大会信息 会议简称&#xff1a;ICFTCI 2024 大会地点&#xff1a;中国西安 投稿邮箱&#xff1a;icftcisub-paper.com 【2】会议简介 2024年金融贸易与创意产业国际会议即将召开&#xff…

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

Spring Boot + EasyExcel + SqlServer 进行批量处理数据

前言 在日常开发和工作中&#xff0c;我们可能要根据用户上传的文件做一系列的处理&#xff0c;本篇文章就以Excel表格文件为例&#xff0c;模拟用户上传Excel文件&#xff0c;讲述后端如何高效的进行数据的处理。 一.引入 EasyExcel 依赖 <!-- https://mvnrepository.com/…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

Visual Studio Code的安装与配置

Visual Studio Code&#xff08;简称 VS Code&#xff09;是 Microsoft 在2015年4月30日 Build 开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代 Web 和云应用的跨平台源代码编辑器&#xff0c;可在桌面上运行&#xff0c;并且可用…

golang函数

【1】函数&#xff1a; 对特定的功能进行提取&#xff0c;形成一个代码片段&#xff0c;这个代码片段就是我们所说的函数 【2】函数的作用&#xff1a;提高代码的复用性 【3】函数和函数是并列的关系&#xff0c;所以我们定义的函数不能写到main函数中 【4】基本语法 func 函…

Redis高并发高可用

1. 复制机制 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会将数据复制多个副本部署到其他机器&#xff0c;以满足故障恢复和负载均衡等需求。Redis提供了复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;后面的…

DeepSpeed Monitoring Comm. Logging

Monitoring 支持多种后端&#xff1a;Tensorboard、WandB、Comet、CSV文件&#xff1b; TensorBoard例子&#xff1a; 自动监控&#xff1a;DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可&#xff1a; {"tensorboard": {"enabl…

HTML+CSS+JS 自定义下拉菜单

效果演示 实现了一个下拉菜单的动画效果&#xff0c;包括一个主按钮和一个下拉菜单列表。点击主按钮会展开下拉菜单列表&#xff0c;同时箭头会旋转&#xff0c;列表项会逐渐显示出来。鼠标悬停在列表上时&#xff0c;会出现一个浮动图标。整个下拉菜单的样式比较简洁&#xff…

vue3第三十九节(TS中的高级类型,分类以及使用注意事项)

前言&#xff1a;为什么需要使用高级类型&#xff0c;正常的类型不能满足日常的业务需求&#xff0c;对于复杂的数据结构、函数签名、类型转换&#xff0c;我们需要使用高级类型来处理&#xff0c;常用的高级类型包含以下几种&#xff1a; 常用的类型定义&#xff1a; 基本类…

理解 GPIO 的推挽与开漏

在日常的嵌入式开发过程当中&#xff0c;GPIO可以说是接触最多的外设了。小到点亮一个LED灯&#xff0c;大到模拟总线通讯&#xff0c;都必不可少地需要用到GPIO资源。而对于GPIO的两大输出模式 ——推挽输出和开漏输出&#xff0c;你是否真正理解了呢&#xff1f; 首先我们看…

HCIA14 DHCP 实验

动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;由 RFC 2131 定义&#xff0c;采用客户端/服务器通信模式&#xff0c;由客户端&#xff08;DHCP Client&#xff09;向服务器&#xff08;DHCP Server&#xff09;提出配置申请&#xff0c;服…