代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

本文主要是介绍代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode 344 反转字符串

在这里插入图片描述
本题思路:反转字符串比较简单,定义两个指针,一个 i = 0, 一个 j = s.length-1。然后定义一个临时变量 tmp,进行交换 s[i] 和 s[j]。

class Solution {public void reverseString(char[] s) {int i = 0;int j = s.length-1;while(i <= j){char tmp = s[i];s[i] = s[j];s[j] = tmp;i++;j--;}}
}

LeetCode 541 反转字符串||

在这里插入图片描述

本题思路:最重要的理解题目含义,就是每一次走 2*k 步,如果剩余的字符长度大于等于k,就反转前 k 个字符,如果小于 k , 就将剩下的全部反转。 个人感觉这个剩余字符小于 2k的条件毫无软用,

下面用一个例子来分析下思路,方便更好理解。

  • 初始情况下 i = 0, i 每次走 i += 2 * k 步在这里插入图片描述
  • 判断剩余个数是否大于等于 k =2,其实就是判断(i + k <= array.length) 此时符合条件,反转前 K 个 ,调用 reverseSubStr(i,i+k,array),左闭右开。 在这里插入图片描述
  • i 往后移动 i = i + 2 * k,此时 i = 0 + 4 = 4在这里插入图片描述
  • 继续判断 (i + k <= array.length) ,此时条件符合 4 + 2 <= 6, 反转前 K 个 ,调用 reverseSubStr(i,i+k,array),左闭右开。 在这里插入图片描述
  • 此时 i = i + 2 * k = 4 + 8,不符合循环,结束。最终结果如下在这里插入图片描述
class Solution {public String reverseStr(String s, int k) {// 将字符串转换成数组char[] array = s.toCharArray();for(int i = 0; i < array.length; i+=2*k){// 先判断如果剩余字符个数大于 k,或者小于 2k, 就反转这前 K个// 本题主要理清楚,只要剩余个数大于等于k,if(i + k <= array.length){reverseSubStr(i,i+k,array);continue;}// 如果小于 K,就反转剩下的全部reverseSubStr(i,array.length,array);}return new String(array);}// 左闭右开public static void reverseSubStr(int l,int r, char[] s){while(l <= r-1){char tmp = s[l];s[l] = s[r-1];s[r-1] = tmp;l++;r--;}}
}

KamaCoder 替换数字

在这里插入图片描述
本题思路:使用字符串拼接,使用 StringBuilder,遍历字符串,如果是 小写字母的话直接拼接,即可,如果是数字的话,就拼接 “number”

public class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();StringBuilder sb = new StringBuilder();for( Character c  : s.toCharArray()){if(c >= 'a' && c <= 'z' ){sb.append(c);}else{sb.append("number");}}System.out.println(sb);}
}

LeetCode 151 反转字符串中的单词

在这里插入图片描述
本题思路

  1. 去掉前面、后面、单词之间的重复空格
  2. 先整体反转
  3. 再单个单词反转

通过示例 2 ,来画个图分析下思路,下面是初始状态在这里插入图片描述

  • 首先是去空格判断,定义一个 Trim() 方法,来进行去除两端的空格,通过定义两个指针,一个 left ,一个 right, left++, right–。碰到第一个不为空格的就停下。在这里插入图片描述
  • 这是去掉两端空格以后的字符串 s在这里插入图片描述
  • 接下里就要进行字符串之间的多余空格进行去重,遍历字符串 s 分为两步; 新定义一个字符串拼接 StringBuilder sb
    • 如果不是空格的话,就直接拼接 sb.append(s.charAt(left)),如下,left++,直到遇到空格停止在这里插入图片描述
    • 可以看到上图,此时就遇到了空格,因为可能有多个空格,我们需要保留一个空格,所以需要判断 (left-1) 这个元素是不是空格,如果是空格,说明空格已经保存了,就跳过不做任何处理,直到遇到的不是空格为止, 可以看到上图 left-1 元素不是空格,所以直接拼接空格,并且left++;在这里插入图片描述
    • 此时上图,又遇到不是空格,直接拼接在这里插入图片描述
  • 最终得到 sb, 去掉多余空格以后的新字符串 sb在这里插入图片描述

  • 接下来就是反转全部字符串,这个逻辑的话和上述反转字符串一样,定义两个指针,一个 left, 一个 right, 然后定义一个 临时变量来交换 这两个数字
  • 最后反转每一个单词。

此处,使用 StringBuilder的时候, 不能 sb.charAt(left) = sb.charAt(right),会有语法错误。必须使用 sb.setCharAt(原值,要改变的值)

class Solution {public String reverseWords(String s) {// 1. 先去掉多余的空格StringBuilder sb = Trim(s);// 2. 先反转全部Reverse(sb,0,sb.length()-1);// 3. 反转每一个单词;// 定义反转起始位置int start = 0;// 定义反转结束位置int end = 0;for (int i = 0; i < sb.length(); i++) {// 找到第一个为空格的下标if (sb.charAt(i) == ' ') {end = i - 1;Reverse(sb, start, end);start = end + 2;}}// 最后一个单词单独进行反转Reverse(sb,start,sb.length()-1);return sb.toString();}// 反转所有单词public static void Reverse(StringBuilder s, int start, int end) {int left = start;int right = end;while (left <= right) {char tmp = s.charAt(left);s.setCharAt(left, s.charAt(right));s.setCharAt(right, tmp);left++;right--;}}// 去空格public static StringBuilder Trim(String s) {int left = 0;int right = s.length() - 1;StringBuilder sb = new StringBuilder();// 去除前面的空格while (left <= right && s.charAt(left) == ' ') {left++;}// 去除后面的空格while (left <= right && s.charAt(right) == ' ') {right--;}// 去重字符串之间的多余空格while (left <= right) {// 如果不等于空格,直接拼接这个字符if (s.charAt(left) != ' ') {sb.append(s.charAt(left));left++;} else { // 此时等于空格,需要判断前面一个是否为空格if (s.charAt(left - 1) != ' ') {sb.append(s.charAt(left));left++;} else {left++;}}}return sb;}
}

虽然整体逻辑不难,但是写代码的时候,出现了很多错误,考虑不周到。还得多写几遍,没那么简单。

KamaCoder 右旋字符串

在这里插入图片描述
本题思路

  1. 先整体反转
  2. 再反转前 k 个
  3. 再反转后 length - k 个

可以通过下图分析得到,为什么这么做!在这里插入图片描述

public static void main (String[] args) {/* code */Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();int k = scanner.nextInt();     // 1. 先整体旋转s = reverse(s,0,s.length()-1);// 2. 再分别反转s = reverse(s,0,k-1);s = reverse(s,k,s.length()-1);System.out.println(s);}// 此处左闭右闭public static String reverse(String s, int start,int end){char[] array = s.toCharArray();int left = start;int right = end;while (left < right) {char tmp = array[left];array[left] = array[right];array[right] = tmp;left++;right--;}return new String(array);}

写这道题的时候,直接用 String 来进行交换,出现了语法错误。因为 String 是不可变的,不能交换里面的内容!

这篇关于代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt