【leetcode热题】反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

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

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

解法一

题目很直观,做法也会很直观,哈哈。遍历原字符串,遇到字母就加到一个 temp 变量中,遇到空格,如果 temp 变量不为空,就把 temp 组成的单词加到一个栈中,然后清空 temp 继续遍历。

最后,将栈中的每个单词依次拿出来拼接即可。

有一个技巧可以用,就是最后一个单词后边可能没有空格,为了统一,我们可以人为的在字符串后边加入一个空格。

public String reverseWords(String s) {Stack<String> stack = new Stack<>();StringBuilder temp = new StringBuilder();s += " ";for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == ' ') {if (temp.length() != 0) {stack.push(temp.toString());temp = new StringBuilder();}} else {temp.append(s.charAt(i));}}if (stack.isEmpty()) {return "";}StringBuilder res = new StringBuilder();res.append(stack.pop());while (!stack.isEmpty()) {res.append(" ");res.append(stack.pop());}return res.toString();
}

解法二

可以看下题目中的 Follow up

For C programmers, try to solve it in-place in O(1) extra space.

如果用 C 语言,试着不用额外空间解决这个问题。

我们一直用的是 java,而 java 中的 String 变量是不可更改的,如果对它修改其实又会去重新创建新的内存空间。

而 C 语言不同,C 语言中的 string 本质上其实是 char 数组,所以我们可以在给定的 string 上直接进行修改而不使用额外空间。

为了曲线救国,继续用 java 实现,我们先将 String 转为 char 数组,所有的操作都在 char 数组上进行。

 char[] a = s.toCharArray();

至于算法的话,参考了 这里-no-split(-)-no-StringBuilder)。

主要是三个步骤即可。

  1. 原地逆转 char 数组,这会导致每个单词内部也被逆转,接下来进行第二步
  2. 原地逆转每个单词
  3. 去除多余的空格

具体代码的话就直接从 这里-no-split(-)-no-StringBuilder) 粘贴过来了,写的很简洁。几个封装的函数,关键就是去解决怎么原地完成。

public String reverseWords(String s) {if (s == null) return null;char[] a = s.toCharArray();int n = a.length;// step 1. reverse the whole stringreverse(a, 0, n - 1);// step 2. reverse each wordreverseWords(a, n);// step 3. clean up spacesreturn cleanSpaces(a, n);
}void reverseWords(char[] a, int n) {int i = 0, j = 0;while (i < n) {while (i < j || i < n && a[i] == ' ') i++; // skip spaceswhile (j < i || j < n && a[j] != ' ') j++; // skip non spacesreverse(a, i, j - 1);                      // reverse the word}
}// trim leading, trailing and multiple spaces
String cleanSpaces(char[] a, int n) {int i = 0, j = 0;while (j < n) {while (j < n && a[j] == ' ') j++;             // skip spaceswhile (j < n && a[j] != ' ') a[i++] = a[j++]; // keep non spaceswhile (j < n && a[j] == ' ') j++;             // skip spacesif (j < n) a[i++] = ' ';                      // keep only one space}return new String(a).substring(0, i);
}// reverse a[] from a[i] to a[j]
private void reverse(char[] a, int i, int j) {while (i < j) {char t = a[i];a[i++] = a[j];a[j--] = t;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VulnHub - DarkHole

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DarkHole 靶机下载地址&#xff1a;DarkHole: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xf…

深度学习——第10章 优化神经网络:如何防止过拟合(DNN)

第10章 优化神经网络:如何防止过拟合(DNN) 目录 10.1 什么是过拟合 10.2 L1、L2正则化 10.3 L2正则化的物理解释 10.4 Dropout正则化 10.5 其它正则化技巧 10.6 总结 上一课,我们一步步搭建了一个深层神经网络来实现图片的分类。结果显示,随着网络层数加深,隐藏层数…

C语言自学笔记3-----C语言运算符及优先级

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示了 C 语言支持的所有算术运算符。 假设变量 A 的…

Kafka 实现之接口设计 —— 生产者 API、消费者 API

目录 一. 前言 二. 生产者 API 三. 消费者 API 3.1. 低级别 API 3.2. 高级别 API 一. 前言 Kafka 强大的应用程序层的基础是用于访问存储的两个基本 API&#xff0c;即用于写入事件的生产者 API和用于读取事件的消费者 API。在这两个 API 之上构建了用于集成和处理的 API。…

在域控批量导出用户及其所在路径的信息

在Windows Server的Active Directory环境中&#xff0c;要批量导出用户及其所在OU&#xff08;组织单位&#xff09;的信息&#xff0c;可以使用PowerShell命令来实现。以下是一个简单的示例&#xff1a; Get-ADUser -Filter * -Properties CanonicalName | Select-Object Nam…

力扣-160. 相交链表(双指针)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&a…

ARTS Week 20

Algorithm 本周的算法题为 1222. 可以攻击国王的皇后 在一个 下标从 0 开始 的 8 x 8 棋盘上&#xff0c;可能有多个黑皇后和一个白国王。 给你一个二维整数数组 queens&#xff0c;其中 queens[i] [xQueeni, yQueeni] 表示第 i 个黑皇后在棋盘上的位置。还给你一个长度为 2 的…

【JVM】字节码指令 invokevirtual

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;invokevirtual 是一个字节码指令&#xff0c;用于调用对象实例的方法。它的主要作用是执行对象的虚方法调用&#xff0c;遵循Java语言中的动态分派机制。 例如&#xff0c;假设我们有以下Java代码&#xff1a; Java 1…

AI与广告创意:大模型在广告生成中的应用与挑战

AI与广告创意&#xff1a;大模型在广告生成中的应用与挑战 摘要&#xff1a; 本文将探讨AI大模型在广告创意生成中的应用&#xff0c;并分析其面临的挑战。 引言&#xff1a; 在当今信息爆炸的时代&#xff0c;广告创意生成的重要性不言而喻。广告创意需要吸引目标受众的注…

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测…

stm32是用标准库还是hal库?

我大学几年一直都是使用标准库&#xff0c;然后17年毕业第一份工作转为HAL库&#xff0c;主要也是公司需求没办法。然后之后的数年我都是建议转HAL库&#xff0c;并不是这个库有多好&#xff0c;相反小问题很多&#xff0c;但是有一个&#xff0c;这是官方一直在开发维护的库&a…

软件开发秘籍:打造高效的分支管理策略

版本控制策略&#xff1a;如何制定合理的分支管理策略 引言 版本控制是软件开发中至关重要的一环&#xff0c;而合理的分支管理策略则是版本控制成功的关键。本文将介绍如何制定合理的分支管理策略&#xff0c;并通过实际案例和技巧&#xff0c;帮助读者更好地理解和应用。 …

SpringBoot3快速入门

目录 一、快速创建项目 二、手动创建一个工程 一、快速创建项目 1、使用官网提供的spring组件创建一个springboot3工程&#xff0c;springboot3要使用JDK17以上的版本 选择配置点击finish&#xff0c;刷新maven 创建一个controller层&#xff0c;写一个demo&#xff0c;点击运…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

二十、HTML

一、什么是HTML 超文本标记语言&#xff0c;不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;描述网页的语言&#xff0c;HTML使用标签描述网页中图片、文本、音乐、视频、超链接等。 二、常用标签 1、标题标签 <h1>一级标题</h1> 1-6 2、段落标签<p&…

Github 2024-03-13 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目1Curl:用于传输数据的命令行工具和库 创建周期:5067 天开发语言:C协议类型:OtherStar数量:32994 个Fork数量:6208 次关注人…

vscode使用npm命令无反应,而终端可以的解决办法

如若你遇到这种情况 使用命令 get-command npm 去下面这个路径把它删掉就可以了

在linux中如何后台运行java项目(详细)

目录 1.查看是否安装有jdk环境 2.将打包好的jar上传到linux服务器上 3.运行java程序 直接运行&#xff1a; 使用 & 使用 nohup & 扩展知识 1.查看是否安装有jdk环境 java -version 如果可以查看到jdk版本 &#xff0c;那就代表环境配置好了 2.将打包好的jar上…

Java JUC 笔记(2)

Java JUC 笔记&#xff08;2&#xff09; 锁框架 JDK5以后增加了Lock接口用来实现锁功能&#xff0c;其提供了与synchronized类似的同步功能&#xff0c;但是在使用时手动的获取和释放锁 Lock和Condition锁 这里的锁与synchronized锁不太一样&#xff0c;我们可以认为是Loc…

【硬件工程师面经整理30_工艺现状】

请描述一下国内的工艺现状 工艺水平&#xff1a;中国的器件工艺水平在不断提高&#xff0c;已经可以制造出高性能、高可靠性的器件产品。在集成电路领域&#xff0c;中国已经具备了一定的制造能力和产业规模&#xff0c;能够生产一些中低端的芯片产品。在光电器件、传感器、功…