LeetCode 344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

本文主要是介绍LeetCode 344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

344.反转字符串


因为字符串也是一种数组,所以元素在内存中是连续分布

题目链接:https://leetcode.cn/problems/reverse-string/

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]

示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]

头尾双指针法

相当于交换数组元素操作
class Solution {public void reverseString(char[] s) {int i = 0;int j =  s.length - 1;while(i < j){char temp = s[i];//注意是用字符接收s[i] = s[j];s[j] = temp;i++;j--;}}
}

541. 反转字符串II


这个反转要仔细读题

题目链接:https://leetcode.cn/problems/reverse-string-ii/

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = "abcdefg", k = 2输出: "bacdfeg"

class Solution {public String reverseStr(String s, int k) {char[] ch = s.toCharArray();for(int i = 0; i < ch.length; i += 2 * k){int start = i;int end = Math.min(ch.length - 1, start + k - 1);//这步的ch.length-1将条件1考虑到了,start+k-1考虑到了第二个条件,相当的巧妙while(start < end){char temp = ch[start];ch[start] = ch[end];ch[end] = temp;start++;end--;}}return new String(ch);}
}
思路:
首先将字符串转化为字符数组
解题关键:定义首尾指针,这里尾指针很关键
int end = Math.min(ch.length - 1, start + k - 1);//这步的ch.length-1将条件1考虑到了,start+k-1考虑到了第二个条件,相当的巧妙

剑指Offer 05.替换空格


题目链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = "We are happy."输出:"We%20are%20happy."

StringBuilder方法

思路:使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制
class Solution {public String replaceSpace(String s) {if(s == null){//不需要判断因为下面循环已经判断了,不满足条件直接就输出了return null;}StringBuilder sb = new StringBuilder();//可变对象for(int i = 0; i < s.length(); i++){if(s.charAt(i) == ' '){sb.append("%20");}else{sb.append(s.charAt(i));}}return sb.toString();}
}
注意:charAt()获取到的是字符,不是字符串
思考:为什么不用这个思路呢:先把字符串根据空格拆分形成字符串数组,之后再遍历字符串数组,遇到空格进行append;
上述步骤出问题在charAt这,因为charAt这取不到字符串数组中的单个字符串,所以上面方法不能成立。
class Solution {public String replaceSpace(String s) {if(s == null || s.length() == 0){//要判断s的长度,因为用到了双指针return s;}StringBuilder str = new StringBuilder();for(int i = 0; i < s.length(); i++){if(s.charAt(i) == ' '){str.append("  ");//}}if(str.length() == 0){return s;}//有空格的情况int left = s.length() - 1;s += str.toString();int right = s.length() - 1;char[] c = s.toCharArray();while(left >= 0){if(c[left] != ' '){c[right] = c[left];}else{c[right--] = '0';c[right--] = '2';c[right] = '%';}left--;right--;}return new String(c);}
}

官方解答

思路:很好,巧妙运用了new String(array,起始,结束)
class Solution {public String replaceSpace(String s) {int len = s.length();char[] ch = new char[3 * len];int size = 0;for(int i = 0; i < len; i++){if(s.charAt(i) == ' '){ch[size++] = '%';ch[size++] = '2';ch[size++] = '0';}else{ch[size++] = s.charAt(i);}}return new String(ch,0,size);}
}
String newStr = new String(array, 0, size);//其作用是将array函数从0到size由数组变成字符串,左闭右开

151.翻转字符串里的单词


全面考察字符串的操作,重点看 方法二 对之后的代码书写细节会有一个提高
部分细节说明
StringBuilder 中有reverse()方法,并且包含了首位位置,但StringBuilder s = s1.reverse();只能将整体反转,不能指定起始位置split() 可以引入正则表达式public void reverse(StringBuilder sb, int left, int right) {while (left < right) {char tmp = sb.charAt(left);//主要是用来替换的,方法里面有两个参数 setCharAt(int index,Char ch)//第一个参数是取代的位置 索引从0开始 第二个参数是你要替换为的字符串sb.setCharAt(left++, sb.charAt(right));sb.setCharAt(right--, tmp);}}

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:输入: "the sky is blue"输出: "blue is sky the"

示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:输入: "a good example"输出: "example good a"解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

用API

class Solution {public String reverseWords(String s) {//去除字符串的首位字符String s1 = s.trim();//将字符串中的一个或多个空格进行拆分String[] s2 = s1.split(" +");StringBuilder s3 = new StringBuilder();for(int i = s2.length - 1; i >= 0; i--){s3.append(s2[i] + ' ');}return s3.toString().trim();}
}

方法二

不使用Java内置方法实现* 1.去除首尾以及中间多余空格* 2.反转整个字符串* 3.反转各个单词
  • 官方答案,已经注释的很清晰了

class Solution {public String reverseWords(String s) {StringBuilder sb = trimSpaces(s);
​// 翻转字符串reverse(sb, 0, sb.length() - 1);
​// 翻转每个单词reverseEachWord(sb);
​return sb.toString();}
​public StringBuilder trimSpaces(String s) {int left = 0, right = s.length() - 1;// 去掉字符串开头的空白字符while (left <= right && s.charAt(left) == ' ') {++left;}
​// 去掉字符串末尾的空白字符while (left <= right && s.charAt(right) == ' ') {--right;}
​// 将字符串间多余的空白字符去除StringBuilder sb = new StringBuilder();while (left <= right) {char c = s.charAt(left);
​if (c != ' ') {sb.append(c);} //如果为空格 但是sb中最后一个不是空格也加入进去 (这样就将多个空格变成了一个空格)else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}
​++left;}return sb;}
​//将字符串进行反转 a good example就反转成 elpmaxe doog apublic void reverse(StringBuilder sb, int left, int right) {while (left < right) {char tmp = sb.charAt(left);//主要是用来替换的,方法里面有两个参数 setCharAt(int index,Char ch)//第一个参数是取代的位置 索引从0开始 第二个参数是你要替换为的字符串sb.setCharAt(left++, sb.charAt(right));sb.setCharAt(right--, tmp);}}
​//这个主要是将elpmaxe doog a 变成 example good apublic void reverseEachWord(StringBuilder sb) {int n = sb.length();int start = 0, end = 0;
​while (start < n) {// 循环至单词的末尾while (end < n && sb.charAt(end) != ' ') {//注意end < n 一定放在前面判断++end;}// 翻转单词reverse(sb, start, end - 1);//这里调用的是自己的reverse方法,注意是end - 1// 更新start,去找下一个单词start = end + 1;++end;}}
}

剑指Offer58-II.左旋转字符串


String 的API substring截取之后,原字符串本身并没有变

题目链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"

示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose"

限制:1 <= k < s.length <= 10000

常规拼接方法

  • 方法一

class Solution {public String reverseLeftWords(String s, int n) {StringBuilder str = new StringBuilder();for(int i = n ; i < s.length(); i++){str.append(s.charAt(i));}for(int i = 0; i < n; i++){str.append(s.charAt(i));}return str.toString();       }
}
  • 方法二

class Solution {public String reverseLeftWords(String s, int n) {String s1 = s.substring(0,n);String s2 = s.substring(n);return s2 + s1;}
}

先局部反转再 整体反转

先把左面字符串反转,在反转右面,在整体反转,注意:反转的次序不要错
  • 方法一:利用数组进行交换

class Solution {public String reverseLeftWords(String s, int n) {char[] c = s.toCharArray();reverse(c, 0, n - 1);reverse(c, n, c.length - 1);reverse(c, 0,c.length - 1);return new String(c);}public void reverse(char[] c, int left, int right){while(left < right){char temp = c[left];c[left] = c[right];c[right] = temp;left++;right--;}}
}
  • 方法二

利用字符串进行交换

class Solution {public String reverseLeftWords(String s, int n) {StringBuilder str = new StringBuilder(s);int len = s.length();reverse(str, 0, n - 1);reverse(str, n, len - 1);reverse(str, 0, len - 1);return str.toString();}public void reverse(StringBuilder str, int left, int right){while(left < right){char temp = str.charAt(left);str.setCharAt(left++, str.charAt(right));str.setCharAt(right--, temp);}}
}

这篇关于LeetCode 344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803466

相关文章

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介