代码随想录算法训练营第十三天(2)|541. 反转字符串II

server/2025/1/17 12:37:59/

文档讲解:代码随想录

难度:easy

附:冲

passion!!!passion!!!passion!!!

 

541. 反转字符串II

力扣题目链接(opens new window)

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

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

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

示例:

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

思路

 方法1

  1. String是字符常量,由题目要求可知需要对其变化,即需要变量,而且是单线程操作为了效率使用StringBuffer
  2. 循环的判定条件:交换完成的指针位置是否在数组长度内
  3. 三目运算判断和k的关系:如果start+k>length,则剩余位置不够k,则返回length(之后将对剩余字符全部执行反转操作)反之返回start+k。
  4. 三目运算判断和2k的关系:如果start+2k>length,则剩余位置不够2k,则返回length(之后将反转前 k 个字符)其余字符保持原样反之返回start+2k。
  5. 对start和firstk之间的元素进行反转(substring() 方法确定范围)
  6. 判断是否在k到2k范围(如果不足k个元素firstk和secondkt均为length,如果够k,firstk为start+k,如果不够2k,secondk为length(length<start+k))
  7. 对secondkt和firstk之间的元素进行反转(同5)
  8. start+2k
  9. 返回res
java">class Solution {public String reverseStr(String s, int k) {StringBuffer res = new StringBuffer();int length = s.length();int start = 0;while (start < length) {// 找到k处和2k处StringBuffer temp = new StringBuffer();// 与length进行判断,如果大于length了,那就将其置为lengthint firstK = (start + k > length) ? length : start + k;int secondK = (start + (2 * k) > length) ? length : start + (2 * k);//无论start所处位置,至少会反转一次temp.append(s.substring(start, firstK));res.append(temp.reverse());// 如果firstK到secondK之间有元素,这些元素直接放入res里即可。if (firstK < secondK) { //此时剩余长度一定大于k。res.append(s.substring(firstK, secondK));}start += (2 * k);}return res.toString();}
}

补充1:

1,String是字符串常量。
StringBuffer是字符串变量(线程安全)。
StringBuilder是字符串变量(线程不安全)。
2,对String新赋值时会改变其对象引用,同时会回收原对象,影响性能。
3,StringBuffer是对对象本身修改,不会产生垃圾。
4,少量字符串操作使用String,单线程内大量字符串操作使用StringBuilder,多线程内大量字符串操作使用StringBuffer;
5,速度StringBuilder>StringBuffer>String.
                        
原文链接:https://blog.csdn.net/zhao4878179/article/details/125816084

补充2:

substring() 方法
用法:substring() 方法用于提取字符串中介于两个指定下标之间的字符。
语法:string.substring(start,stop)


示例:
let str = "0123456789"
 
str.substring(0)   // 0123456789 输入0会原字符串输出
str.substring(3)   // 3456789    从第三位开始截取,如果第二个参数忽略则截取到字符串末尾
 
str.substring(3,7)   // 3456  前包括后不包括
 
提示:substring 不支持负数,如果是负数会输出原字符串

原文链接:https://blog.csdn.net/qq_34402069/article/details/124758417

 方法2

  1.   tochararray()方法将字符串对象中的字符转换为字符数组
  2. 循环
  3. 判断尾数够不够k个来取决end指针的位置
  4. 交换
java">//题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转
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;//这里是判断尾数够不够k个来取决end指针的位置int end = Math.min(ch.length - 1, start + k - 1);//用异或运算反转 while(start < end){ch[start] ^= ch[end];ch[end] ^= ch[start];ch[start] ^= ch[end];start++;end--;}}return new String(ch);}
}// 还可以用temp来交换数值
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;// 判断尾数够不够k个来取决end指针的位置int end = Math.min(ch.length - 1,start + k - 1);while(start < end){char temp = ch[start];ch[start] = ch[end];ch[end] = temp;start++;end--;}}return new String(ch);}
}

补充3:

 tochararray()可以将字符串对象中的字符转换为字符数组。也可以将字符串视为char型数组。

Split和ToCharArray的区别:

(1)split是根据你需要按照的分隔符来分割的。

比如:String a = "avc,d,e,s,f"; String []b = a.split(',');这个就是根据逗号将数据分开,遍历输出得到的b的对象为"avc","d","e","s","f"。

(2)toCharArray是将String对象的每一个下标位的对象保存在char[]中。

比如:String a = "abcd"; char[] b = a.toCharArray();这个b保存的信息就是['a','b','c','d']。

方法3 

  1. 每隔 2k 个字符的前 k 个字符进行反转
  2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
  3.  剩余字符少于 k 个,则将剩余字符全部反转
java">// 解法3
class Solution {public String reverseStr(String s, int k) {char[] ch = s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i = 0; i< ch.length; i += 2 * k) {// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if (i + k <= ch.length) {reverse(ch, i, i + k -1);continue;}// 3. 剩余字符少于 k 个,则将剩余字符全部反转reverse(ch, i, ch.length - 1);}return  new String(ch);}// 定义翻转函数public void reverse(char[] ch, int i, int j) {for (; i < j; i++, j--) {char temp  = ch[i];ch[i] = ch[j];ch[j] = temp;}}
}


http://www.ppmy.cn/server/159083.html

相关文章

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

基于ADMM交替方向乘子法的超大规模储备系统分布式协同优化算法收敛性matlab仿真与分析

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于ADMM交替方向乘子法的超大规模储备系统分布式协同优化算法收敛性matlab仿真与分析。为了验证算法在超大规模储能系统中应用的可行性&#xff0c;在一个由10/21个子储能系统…

数据仓库的复用性:模型层面通用指标体系、参数化模型、版本化管理

在数据仓库设计中&#xff0c;复用性 是一个关键原则&#xff0c;它不仅能提升数据资产的使用效率&#xff0c;还能降低开发成本、优化系统运维。下面将从 模型层面的复用性、通用指标体系、参数化模型、版本化管理 四个方面进行详细介绍&#xff0c;并提供可落地的设计方案。 …

解决 Mac 系统上的 node-sass 问题

解决 Mac 系统&#xff08;尤其是 M1/M2&#xff09;上的 node-sass 问题 问题描述 在 Mac 系统上使用 node-sass 时&#xff0c;经常会遇到以下错误&#xff1a; Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (108)或者…

63. 不同路径 II

63. 不同路径 II 题目-中等难度1. 题目-中等难度 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。 网格中…

高防cdn有用吗?防护怎么样?

网络攻击的手段日趋多样化&#xff0c;尤其是针对高流量网站和在线业务。在这种情况下&#xff0c;高防CDN&#xff08;内容分发网络&#xff09;作为一种新兴的网络安全防护工具&#xff0c;越来越受到企业和网站管理者的关注。那么&#xff0c;高防CDN究竟有用吗&#xff1f;…

C++基础入门(二)

目录 前言 一、重载 1.函数重载 2.运算符重载 二、构造函数 1.什么是构造函数 2.带参数的构造函数 3.使用初始化列表 4.this关键字 5.new关键字 三、析构函数 1.什么是析构函数 四、静态成员变量 1.静态成员的定义 2.静态成员变量的作用 五、继承 1.继承基本概…

MySQL使用正则表达式查询

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…