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. mybatis之生命周期及作用域

    SqlSessionFactoryBuilder 一旦创建了SqlSessionFactory之后就没有作用了 局部变量 SqlSessionFactory 可以理解为数据库的连接池 SqlSessi ...

  2. [JXOI2017] 加法 题解

    最小值最大,考虑二分答案,问题转为判断最小值是否能 \(\ge x\). 假如 \(a_i\ge x\),那我们肯定不管:假如 \(a_i<x\),那最好能让选择的区间 \(r\) 值更大,用优 ...

  3. OpenLayers 绘制带箭头的LineString

    <!--******************************************************************** * Copyright 2000 - 2022 ...

  4. Flink学习(一) 行情介绍

    想进大厂,必须掌握 Flink 技术!!! 随着大数据时代的发展.海量数据的实时处理和多样业务的数据计算需求激增,传统的批处理方式和早期的流式处理框架也有自身的局限性,难以在延迟性.吞吐量.容错能力, ...

  5. form-create-designer中怎么扩展自定义组件

    form-create-designer中怎么扩展自定义组件 form-create-designer 是基于 @form-create/element-ui实现的表单设计器组件.可以通过拖拽的方式快 ...

  6. 介绍一下opentcs

    OpenTCS是一个开源的自动运载系统(Automated Guided Vehicle,AGV)控制系统.它旨在管理和控制自动化运输车辆,例如AGV或自动搬运车(AMR),在工业和商业环境中执行各种 ...

  7. RP 点归入Set And Coupling 约束创建

    想用python脚本创建一个耦合coupling关系,需要定义control piont和被控制的surfaces.两者都可以先分别归入到set 和surface里,最后用set和surface作为c ...

  8. 《空间三角面片对相交判断算法》的matlab实现_ 0.2微秒

    function [flag] = InsectTriPatch(T1,T2) % 判断两个空间三角形面片是否相交 % T1=[0 0 0; % 2 0 0; % 0 1.5 0; % 0 0 1]; ...

  9. sap 管理--企业解决方案 -设备管理

    1.什么是sap 管理 2.设备管理管的是什么 3.设备的几种状态 4.设备bom(物料清单) 5.测量点计数器 1.什么是sap 管理 System Applications and Product ...

  10. python os.walk函数

    os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. root 所指的是当前正在遍历的这个文件夹的本身的地址 dirs 是一个 list ,内容是该文件夹中所有的目录的名 ...