目录
一、反转字符串-LeetCode 344
Leecode链接: leetcode 344
文章链接: 代码随想录
视频链接: B站
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
思路
双指针,一个指向头,一个指向尾,逐个交换数组元素,直到左指针在右指针右边时退出循环。
实现代码
//cpp
class Solution {
public:
void reverseString(vector<char>& s) {
int left,right;
left = 0;
right = s.size()-1;
while(left<right){
char t = s[right];
s[right] = s[left];
s[left] = t;
right--;
left++;
}
}
};
个人问题
可以用库函数swap,无所谓,基本原理都一样。
总结
整体简单,算法时间复杂度为O(n),空间复杂度为O(1)。
二、反转字符串Ⅱ-LeetCode 541
Leecode链接: LeetCode 541
文章链接: 代码随想录
视频链接: B站
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
思路
我的思路是:首先计算字符总数,然后对2k进行除计算,这样我就知道需要进行多少次字符反转,然后计算求余结果,判断剩余字符的个数然后进行剩余字符的反转操作。卡哥思路是使用for循环每次加一个2k,直到指针不满足要求时,执行特殊操作
实现代码
个人代码
//cpp
class Solution {
public:
void myreverse(string& s,int left,int right){
while(left<right){
swap(s[left++],s[right--]);
}
}
string reverseStr(string s, int k) {
int count = 0;
int left = 0;
int right = k-1;
int len = s.size();
while(count<len/(2*k)){
myreverse(s,left+(count*2