面试经典150题——反转字符串中的单词

面试经典150题 day21

      • 题目来源
      • 我的题解
        • 方法一 双指针
        • 方法二 库函数+正则匹配
        • 方法三 自定义函数
        • 方法四 双端队列

题目来源

力扣每日一题;题序:151

我的题解

方法一 双指针

先将首尾的空格删除,然后使用两个指针从后往前遍历,end指针指向单词的末尾的下一位,start指向单词的首位的前一位。

时间复杂度
空间复杂度

public String reverseWords(String s) {
    s=s.trim();
    int start=s.length()-1;
    int end=s.length();
    StringBuilder sb =new StringBuilder();
    while(start>=0){
        while(start>=0&&s.charAt(start)!=' ')
            start--;
        if(start>=0){
            sb.append(s.substring(start+1,end));
            sb.append(' ');
        }else{
            sb.append(s.substring(0,end));
        }
        while(start>=0&&s.charAt(start)==' ')
            start--;
        end=start+1;
    }
    return sb.toString();
}
方法二 库函数+正则匹配

利用trim、split、以及Collections.reverse和String.join几个库函数。在使用split分割函数时需要注意匹配多个连续空格

时间复杂度:O(n)
空间复杂度:O(n)

public String reverseWords(String s) {
    // 除去开头和末尾的空白字符
    s=s.trim();
    // 正则匹配连续的空白字符作为分隔符分割
    String[] strs=s.split("\\s+");
    List<String> wordL=Arrays.asList(strs);
    Collections.reverse(wordL);
    return String.join(" ",wordL);
}
方法三 自定义函数

自己实现去除前后空格和内部多余空格的trimSpace函数,反转[start,end]的反转函数reverse,反转每个单词的reverseEachWord函数

时间复杂度:O(n)
空间复杂度:O(n)

public String reverseWords(String s) {
    // 除去开头和末尾的空白字符
    StringBuilder sb=trimSpace(s);
    //反转整个字符串
    reverse(sb,0,sb.length()-1);
    //翻转每个单词
    reverseEachWord(sb);
    return sb.toString();
}
public StringBuilder trimSpace(String s){
    int start=0;
    int n=s.length();
    while(start<n&&s.charAt(start)==' ')
        start++;
    int end=n-1;
    while(end>=0&&s.charAt(end)==' ')
        end--;
    StringBuilder sb=new StringBuilder();
    //删除内部多余的空格
    while(start<=end){
        char c=s.charAt(start);
        if(c!=' ')
            sb.append(c);
        else if(sb.charAt(sb.length()-1)!=' '){
            sb.append(c);
        }
        start++;
    }
    return sb;
}

public void reverse(StringBuilder sb,int start,int end){
    while(start<end){
        char s=sb.charAt(start);
        char e=sb.charAt(end);
        sb.setCharAt(start++,e);
        sb.setCharAt(end--,s);
    }
}

public void reverseEachWord(StringBuilder sb){
    int n=sb.length();
    int start=0,end=0;
    while(start<n){
        while(end<n&&sb.charAt(end)!=' ')
            end++;
        reverse(sb,start,end-1);
        while(end<n&&sb.charAt(end)==' ')
            end++;
        start=end;
        end++;
    }
}
方法四 双端队列

双端队列可以在两端入队,在这里采用在头部

时间复杂度:O(n)
空间复杂度:O(n)

public String reverseWords(String s) {
    s=trimSpace(s);
    int n=s.length();
    int start=0;
    Deque<String> queue=new LinkedList<>();
    while(start<n){
        int end=start;
        while(end<n&&s.charAt(end)!=' '){
            end++;
        }
        queue.offerFirst(s.substring(start,end));
        start=end+1;
    }

    return String.join(" ",queue);
}
public String trimSpace(String s){
    int start=0;
    int n=s.length();
    while(start<n&&s.charAt(start)==' ')
        start++;
    int end=n-1;
    while(end>=0&&s.charAt(end)==' ')
        end--;
    StringBuilder sb=new StringBuilder();
    //删除内部多余的空格
    while(start<=end){
        char c=s.charAt(start);
        if(c!=' ')
            sb.append(c);
        else if(sb.charAt(sb.length()-1)!=' '){
            sb.append(c);
        }
        start++;
    }
    return sb.toString();
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器(Http测试板块)

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器&#xff08;Http测试板块&#xff09; 一、使用Http网页界面1、main.cc原码和index.html原码2、运行结果&#xff08;1&#xff09;测试结果1&#xff1a;用index.html内部的代码&#xff08;2&#xf…

《HelloGitHub》第 97 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

win下vscode的vim切换模式的中英文切换

问题描述 在vscode中安装vim插件后&#xff0c;如果insert模式下完成输入后&#xff0c;在中文输入方式下按esc会发生无效输入&#xff0c;需要手动切换到英文。 解决方法 下载完成vscode并在其中配置vim插件下载github—im-select.exe插件&#xff08;注意很多博文中的gitcod…

Microsoft Threat Modeling Tool 使用(二)

主界面 翻译 详细描述 选择了 “SDL TM Knowledge Base (Core)” 模板并打开了一个新的威胁模型。这个界面主要用于绘制数据流图&#xff08;Data Flow Diagram, DFD&#xff09;&#xff0c;它帮助您可视化系统的组成部分和它们之间的交互。以下是界面中各个部分的功能介绍&a…

软件设计师-重点的行为型设计模式

一、命令模式&#xff08;Command&#xff09;&#xff1a; 意图&#xff1a;&#xff08;上午题&#xff09; 将一个请求封装为一个对象&#xff0c;从而使得可以用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 结构…

Django-基础篇

Django是一个开放源代码的Web应用框架&#xff0c;由Python语言编写。它遵循MVC&#xff08;Model-View-Controller&#xff09;的软件设计模式&#xff0c;使开发者能够以高效、可扩展和安全的方式构建Web应用程序。 Django具有以下特点和优势&#xff1a; 强大的功能&#x…

[技术小技巧] 可视化分析:在jupyter中使用d3可视化树形结构

首先在python中定义一个字符串&#xff0c;记录d3.js绘制属性图的js脚本代码模版。其中{{data}}就是将来要被替换的内容。 d3_code_template """ // 创建树状结构数据 var treeData {{data}};// 创建d3树布局 var margin { top: 20, right: 90, bottom: 30,…

行业推荐:数据防泄漏软件首先解决方案

随着信息时代的快速发展&#xff0c;数据安全已成为企业经营的关键之一。然而&#xff0c;数据泄漏事件时有发生&#xff0c;不仅可能导致巨大的经济损失&#xff0c;更会损害企业的声誉和客户信任。 为了帮助企业有效地保护数据安全&#xff0c;Ping32 数据防泄漏系统应运而生…

【跟我学RISC-V】认识RISC-V指令集并搭建实验环境

写在前面 现在计算机的体系架构正是发展得如火如荼的时候&#xff0c;占领桌面端市场的x86架构、占领移动端市场的arm架构、在服务器市场仍有一定地位的mips架构、国产自研的指令集loongarch架构、还有我现在要讲到的新型开源开放的RISC-V指令集架构。 我先说一说我的学习经历…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

【C++题解】1608. 三位数运算

问题&#xff1a;1608. 三位数运算 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 小丽在编程课上学会了拆位运算&#xff0c;她已经可以拆出一个三位整数的百位、十位和个位了&#xff0c;她想知道这个整数的&#xff08;百位 十位&#xff09; / &#xff08;…

Web3与智能合约:科技革新下的新金融时代

在当今数字化时代&#xff0c;Web3和智能合约正在共同塑造着金融领域的未来。Web3作为下一代互联网的重要组成部分&#xff0c;以其去中心化、安全性和透明性为核心特点&#xff0c;正推动着金融行业向着数字化和去中心化的方向发展。而智能合约作为Web3技术的关键应用之一&…

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因&#xff1a;VMware自动选择的网卡可能不对 解决&#xff1a;编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡&#xff0c;断开虚拟机网络连接后重新连接即可

Docker(Docker的安装和介绍,常用命令,镜像制作,服务编排,docker私服)

目录 一、简介 1. docker简介 1 什么是docker 2 容器和虚拟机对比 2. 安装docker 1 docker相关概念 2 安装docker 1 安装docker 2 设置注册中心(仓库) 3. 小结 二、常用命令【重点】 1. 服务管理 2. 镜像管理 1 语法说明 2 使用练习 3. 容器管理 1 容器介绍 2…

2024.4.25 LoadRunner 测试工具详解 —— Controller Analysis

目录 Controller 的使用 创建场景 Controller 快捷方式创建场景 VUG 针对写好脚本创建场景 场景设计 设计初始化 设计启动机制 设计性能测试脚本的执行时间 设计虚拟用户退出机制 场景运行 添加监控指标至图标格区域 Analysis 的使用 汇总报告 测试报表 吞吐量图 …

Dockerfile实战---构建SSH、Tomcat、MySQL、Nginx镜像

目录 引言 一、安装docker程序 二、构建SSH镜像 1.创建镜像 2.基于sshd镜像创建容器 三、构建tomcat镜像 1.创建镜像 2.基于tomcat镜像创建容器 四、构建MySQL镜像 1.创建镜像 2.基于mysqld镜像创建容器 五、构建nginx镜像 1.创建镜像 2.基于nginx镜像创建容器 引…

用Stream流方式合并两个list集合(部分对象属性重合)

一、合并出共有部分 package com.xu.demo.test;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 Arrays.asList(new User(1, "Alic…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

Java8中的Stream流相关用法学习

目录 一、Stream是什么 二、创建Stream 三、中间操作 3.1 filter() 3.2 map() 3.3 flatMap() 3.4 distinct() 3.5 limit() 四、终端操作 4.1 findAny(), 和 orElse() 4.2 sorted() 4.3 forEach() 4.4 count() 4.5 collect() 4.6 groupingBy() 4.7 average() 4…

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释 摘要Introduction RAG-Driver: Generalisable Driving Explanations with Retrieval-Augmented In-Context Learning in Multi-Modal Large Language Model. 摘要 由“黑箱”模型驱动的机器人需要提供人类…