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的更多相关文章

  1. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  2. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  3. 代码随想录算法训练营day08 | leetcode 344.反转字符串/541. 反转字符串II / 剑指Offer05.替换空格/151.翻转字符串里的单词/剑指Offer58-II.左旋转字符串

    基础知识 // String -> char[] char[] string=s.toCharArray(); // char[] -> String String.valueOf(str ...

  4. leecode刷题(11)-- 反转字符串

    leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...

  5. leecode刷题(22)-- 反转数组

    leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...

  6. 刷题-力扣-541. 反转字符串 II

    541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...

  7. 代码随想录-day1

    链表 今天主要是把链表专题刷完了,链表专题的题目不是很难,基本都是考察对链表的操作的理解. 在处理链表问题的时候,我们通常会引入一个哨兵节点(dummy),dummy节点指向原链表的头结点.这样,当我 ...

  8. 字符串反转,例如"abc"反转"cba"

    package stringyiwen; /* * 字符串反转,例如"abc"反转"cba" */public class StringTestChar { p ...

  9. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...

  10. 笔记:iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)(别人的代码直接复制过来的,我脸皮有点厚)

    NSString* str=@"hello";//存在代码区,不可变 NSLog(@"%@",str); //1.[字符串插入] NSMutableString ...

随机推荐

  1. Spark常用Sql

    一.日期处理 1.查询当前日期 SELECT current_date() 2023-12-22 2.查询当前时间戳 select current_timestamp() 2023-12-22 14: ...

  2. flutter3-trip仿携程酒店预订|Flutter3.27+Getx预约旅游酒店App程序

    基于Flutter3.x+Dart3+GetX跨平台仿携程/飞猪旅行酒店客房预订查询app系统. flutter3_trip原创2025新版flutter3.27.1+dart3.6+getx+flu ...

  3. .NET Core 托管堆内存泄露/CPU异常的常见思路

    常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root ...

  4. [SDOI2008] 洞穴勘测 题解

    似乎所有的线段树分治题都能被 \(LCT\) 平替掉? 一眼动态树,直接 \(LCT\). Connect x y 操作用 \(link(x,y)\) 实现,Destroy x y 操作用 \(cut ...

  5. MOS管选型

    MOS管基本参数 MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)作为开关元件的应用非常广泛,其开关特性与三极管相比有所不 ...

  6. 企业付款到零钱(微信小程序提现,用户提现到零钱)

    pom 增加 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>wei ...

  7. MySQL - [20] 事务

    题记部分 一.什么是ACID (1)Atomicity 原子性 某个操作,要么全部执行完毕,要么全部回滚. (2)Consistency 一致性 数据库中的数据全都符合现实世界中的约束,则这些数据就符 ...

  8. Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录

    Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10 ...

  9. selenium 提示 Non-UTF-8 code starting with '\xc4'

    解决(1):在程序最上方加上语句,# coding=gbk 解决(2):在preference下进行修改

  10. 如何用js精确计算一行文字的宽度

    之前有做过一个业务,需要在文本框输入文字的时候动态计算一行文字的宽度.并由此知道当前输入的这段文字会有几行. 如何计算? 每个文字的个数*宽度?理论上可行,但是有一个问题是不同类型的文字对应的宽度是不 ...