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

【LeetCode】151. 反转字符串中的单词(StringBuilder类)

  今日学习的文章链接和视频链接

leetcode题目地址:151. 反转字符串中的单词

 代码随想录题解地址:代码随想录

题目简介

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

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

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

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

看到题目的第一想法(可以贴代码)

1. 遍历字符串(先转成char[]),遇到空格就截止,记录为一个单词(用Map来存,key为下标,value为单词),再组成一个新的字符串。

        注:好像都不需要用Map,因为存取每个单词的时候本身就是有一定顺序的,但map方便遍历是真的,后面我又试了List,只需稍微改动。

2. 利用String的str.split()函数来拆分原字符串,再组成新的字符串,并删掉多余空格。

// str.split()解法
public String reverseWords(String s) {String res = "";for (String i : s.split(" ")){if (!i.isEmpty()) res = i + " "+ res;}return res.substring(0, res.length()-1);
}
// Map解法
public String reverseWords(String s) {String res = "";char[] c = s.toCharArray();String temp = "";int index = 0;Map<Integer,String> m = new HashMap<>();for (int i = 0; i < c.length; i++){if(!Character.isWhitespace(c[i])){temp += c[i];if (i == c.length-1){m.put(index, temp);}} else if (Character.isWhitespace(c[i])){if (!temp.isEmpty()){m.put(index, temp);temp = "";index++;} }}for (String i : m.values()){res = i + " " + res;}return res.substring(0, res.length() - 1);
}
// List解法
public String reverseWords(String s) {String res = "";char[] c = s.toCharArray();String temp = "";List<String> m = new ArrayList<>();for (int i = 0; i < c.length; i++){if(!Character.isWhitespace(c[i])){temp += c[i];if (i == c.length-1){m.add(temp);}} else if (Character.isWhitespace(c[i])){if (!temp.isEmpty()){m.add(temp);temp = "";} }}for (String i : m){res = i + " " + res;}return res.substring(0, res.length() - 1);
}

实现过程中遇到哪些困难

看完代码随想录之后的想法

【解题思路】

对于翻转:先对整个字符串进行翻转,再对里面每个单词进行翻转(负负得正)。

对于移除空格:双指针移除“多余”的空格。

【想法】

双指针可以很方便地取出数组里的一部分元素。

看完视频自己写的ACC:

// 不用 str.split()函数的解法
public String reverseWords(String s) {int left = 0, right = 0;char[] c = s.toCharArray();String res = "";for (int i = 0; i < c.length; i++){if (!Character.isWhitespace(c[i])){right++;if (i == c.length - 1){res = s.substring(left, right) + " " + res;}} else {if (left != right){System.out.println(s.substring(left, right));res = s.substring(left, right) + " " + res;right++;left = right;} else {left++;right++;}}}return res.substring(0,res.length()-1);
}
// 使用 str.split()函数的解法
public String reverseWords(String s) {int left = 0, right = 0;String res = "";for (String i : s.split(" ")){if (!i.isEmpty()) res = i + " " + res;}return res.substring(0,res.length()-1);
}

视频标答:更繁琐,暂略

学习时长


今日收获

1. 判断某个字符串是否为“ ”空格时,不能用str.equals(" "),要用str.isEmpty()

        判断char是否为空格时:Character.isWhitespace(c)

2. StringBuilder sb = new StringBuilder();

常用方法:

1public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2public StringBuffer reverse()
 将此字符序列用其反转形式取代。
3public delete(int start, int end)
移除此序列的子字符串中的字符。
4public insert(int offset, int i)
将 int 参数的字符串表示形式插入此序列中。
5insert(int offset, String str)
将 str 参数的字符串插入此序列中。
6replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。

次常用方法:

1int capacity()
返回当前容量。
2char charAt(int index)
返回此序列中指定索引处的 char 值。
3void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
4void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst
5int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
6int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
8int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置。
9int length()
 返回长度(字符数)。
10void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch
11void setLength(int newLength)
设置字符序列的长度。
12CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
13String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
15String toString()
返回此序列中数据的字符串表示形式。

相关文章:

  • Amazon CodeWhisperer 在 vscode 的应用
  • 全球移动通信(2G/3G/4G/5G)频谱分布情况
  • 程序员的50大JVM面试问题及答案
  • 【笔记】网络流算法模板
  • CSS3新增样式
  • Gitlab仓库推送到Gitee仓库的一种思路
  • 腾讯云debian服务器的连接与初始化
  • 基于Java (spring-boot)的宠物管理系统
  • 【运维面试100问】(九)了解Raid嘛?
  • 【正点原子STM32连载】第十七章 通用定时器中断实验 摘自【正点原子】APM32E103最小系统板使用指南
  • Mysql的SQL优化和锁
  • C语言—每日选择题—Day59
  • Java基础题3:继承
  • Linux网络编程——概述、TCP/UDP的对比
  • 数据库(三)超详细SQL语句入门 | SQL增删改查,重命名,字符操作,联合操作,聚合函数,嵌套子查询
  • Git初体验
  • IndexedDB
  • JSDuck 与 AngularJS 融合技巧
  • Nodejs和JavaWeb协助开发
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 动态魔术使用DBMS_SQL
  • 复杂数据处理
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 计算机在识别图像时“看到”了什么?
  • 用 Swift 编写面向协议的视图
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 阿里云API、SDK和CLI应用实践方案
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 通过调用文摘列表API获取文摘
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 飞书APP集成平台-数字化落地
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $ git push -u origin master 推送到远程库出错
  • (2)Java 简介
  • (C++17) optional的使用
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (分布式缓存)Redis持久化
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (转载)Linux网络编程入门
  • ./configure,make,make install的作用
  • .sh 的运行
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ JavaScript ] JSON方法
  • [20180224]expdp query 写法问题.txt
  • [AIGC] 如何建立和优化你的工作流?
  • [Asp.net mvc]国际化
  • [BUUCTF 2018]Online Tool
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C# 网络编程系列]专题六:UDP编程
  • [CakePHP] 在Controller中使用Helper