代码随想录第八天| Leecode 344. 反转字符串、Leecode 541 反转字符串 II
Leecode 344 反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
- 示例 1:
- 输入:
s = ["h","e","l","l","o"] - 输出:
["o","l","l","e","h"]
- 输入:
- 示例 2:
- 输入:
s = ["H","a","n","n","a","h"] - 输出:
["h","a","n","n","a","H"]
- 输入:
解题思路与代码展示
如果只是需要交换两个变量位置的话,常用的方法都是使用一个temp变量,用于临时存放被覆盖的值,再将其覆盖另一个值。而本题需要交换整个字符串,那么相应地就是需要交换字符串长度除以2次,每次交换的元素两边逐渐往中心移动。即最先交换首尾两个元素,第二个和倒数第二个···一直到最后交换中心的元素。此时需要注意,如果字符串长度为奇数,最后中心剩下一个元素并不需要交换;如果最后中心剩下两个元素,则直接把这两个元素也交换后停止即可。
那么即使同时考虑奇数长度和偶数长度的情形,需要交换的次数也只是字符串长度/2,因为如果是奇数在除以2并放入int型变量后,多出来的0.5直接被省略。由此可以得到代码如下:
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size()/2; // 左右交换的次数,如果长度为偶数则两两交换,奇数则最中间一个不交换,其余交换
for(int i = 0; i < n; i++){
char temp = s[i]; // 使用temp来实现交换操作
s[i] = s[s.size()-i-1]; // 左侧第i个元素,和其对称到右侧的元素进行交换
s[s.size()-i-1] = temp;
}
}
};
上面代码只额外使用了一个char型变量就完成了整个字符串的反转,同时时间复杂度为\(O(n)\)。
Leecode 541 反转字符串 II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
- 示例 1:
- 输入:
s = "abcdefg",k = 2 - 输出:
"bacdfeg"
- 输入:
- 示例 2:
- 输入:
s = "abcd",k = 2 - 输出:
"bacd"
- 输入:
解题思路与代码展示:
本题是上面反转字符串的花样变体,我的思路是套用原本的反转函数,并加上一些判断,如果满足条件则调用反转。这个过程中需要注意各种情况的条件判断。因为题目中提到每2k就要执行对前k个反转,那么可以考虑使用递归或是循环的方式来解决都行,在我下面的代码中使用了递归的方式。
class Solution {
public:
string reverseStrPart(string s, int left, int right){ // 对字符串中left到right和之间的部分进行反转
while(left < right){
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
return s;
}
string reverseStr(string s, int k, int start = 0) { // 本轮周期从start开始计数
if( start >= s.size()-1) return s; // 如果start在字符串最后,则说明整个字符串都已经反转,直接return
int end = start + k-1; // 要反转的部分从start到end及其之间,这个区间中包含了k个数
if(end > s.size()-1) end = s.size()-1; // 但如果start之后的字符串长度已经不够k个,那么令end等于最后一位
return reverseStr(reverseStrPart(s,start,end), k, end+k+1); // 反转start到end之间,同时递归调用,更新字符串,以及更新新的反转区间
}
};
上面代码的时间复杂度为\(O(n)\),只需要遍历一遍字符串即可完成反转。
今日总结
今天题比较少,感觉还挺轻松,自己又刷了两道动态规划的题但暂时不写上来了,等之后刷到动态规划再来写,今天还是早点休息吧。
今天学会了在github上提交pr,然后把前几天画的反转链表的那个动图提交上去了。当时画完只是提了一个issue,今天才懂issue和pr的区别。。
代码随想录第八天| Leecode 344. 反转字符串、Leecode 541 反转字符串 II的更多相关文章
- 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...
- leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...
- 代码随想录算法训练营day08 | leetcode 344.反转字符串/541. 反转字符串II / 剑指Offer05.替换空格/151.翻转字符串里的单词/剑指Offer58-II.左旋转字符串
基础知识 // String -> char[] char[] string=s.toCharArray(); // char[] -> String String.valueOf(str ...
- leecode刷题(11)-- 反转字符串
leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...
- leecode刷题(22)-- 反转数组
leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...
- 刷题-力扣-541. 反转字符串 II
541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...
- 代码随想录-day1
链表 今天主要是把链表专题刷完了,链表专题的题目不是很难,基本都是考察对链表的操作的理解. 在处理链表问题的时候,我们通常会引入一个哨兵节点(dummy),dummy节点指向原链表的头结点.这样,当我 ...
- 字符串反转,例如"abc"反转"cba"
package stringyiwen; /* * 字符串反转,例如"abc"反转"cba" */public class StringTestChar { p ...
- 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...
- 笔记:iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)(别人的代码直接复制过来的,我脸皮有点厚)
NSString* str=@"hello";//存在代码区,不可变 NSLog(@"%@",str); //1.[字符串插入] NSMutableString ...
随机推荐
- Spark常用Sql
一.日期处理 1.查询当前日期 SELECT current_date() 2023-12-22 2.查询当前时间戳 select current_timestamp() 2023-12-22 14: ...
- flutter3-trip仿携程酒店预订|Flutter3.27+Getx预约旅游酒店App程序
基于Flutter3.x+Dart3+GetX跨平台仿携程/飞猪旅行酒店客房预订查询app系统. flutter3_trip原创2025新版flutter3.27.1+dart3.6+getx+flu ...
- .NET Core 托管堆内存泄露/CPU异常的常见思路
常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root ...
- [SDOI2008] 洞穴勘测 题解
似乎所有的线段树分治题都能被 \(LCT\) 平替掉? 一眼动态树,直接 \(LCT\). Connect x y 操作用 \(link(x,y)\) 实现,Destroy x y 操作用 \(cut ...
- MOS管选型
MOS管基本参数 MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)作为开关元件的应用非常广泛,其开关特性与三极管相比有所不 ...
- 企业付款到零钱(微信小程序提现,用户提现到零钱)
pom 增加 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>wei ...
- MySQL - [20] 事务
题记部分 一.什么是ACID (1)Atomicity 原子性 某个操作,要么全部执行完毕,要么全部回滚. (2)Consistency 一致性 数据库中的数据全都符合现实世界中的约束,则这些数据就符 ...
- Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录
Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10 ...
- selenium 提示 Non-UTF-8 code starting with '\xc4'
解决(1):在程序最上方加上语句,# coding=gbk 解决(2):在preference下进行修改
- 如何用js精确计算一行文字的宽度
之前有做过一个业务,需要在文本框输入文字的时候动态计算一行文字的宽度.并由此知道当前输入的这段文字会有几行. 如何计算? 每个文字的个数*宽度?理论上可行,但是有一个问题是不同类型的文字对应的宽度是不 ...