首页 > 其他分享 >【LeetCode字符串#01】反转字符串I+II

【LeetCode字符串#01】反转字符串I+II

时间:2023-02-09 21:23:58浏览次数:60  
标签:字符 01 int 反转 II 字符串 个字符 2k

反转字符串

力扣题目链接(opens new window)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

思路

利用双指针法

344.反转字符串

代码

class Solution {
public:
    void reverseString(vector<char>& s) {
        //定义左右指针
        int right = s.size() - 1;
        for(int left = 0; left < s.size()/2; left++){
            int temp = s[left];
            s[left] = s[right];
            s[right] = temp;

            right--;
        }
    }
};

反转字符串II

力扣题目链接(opens new window)

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

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

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

示例:

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

思路

反转的核心方法与上一题一样,不同的是要实现题目的新规则

一种错误的思路是:

每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。

这样会让代码变复杂

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

所以当需要固定规律一段一段去处理字符串的时候,要想一下通过变化for循环的表达式来解决

代码

class Solution {
public:
    //自己实现一个反转函数,也可以用c++提供的
    void reverse(string& s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);//本质上和用temp去交换一样
        }
    }

    string reverseStr(string s, int k) {
        //注意,for循环可以以2k为区间进行遍历
        for(int i = 0; i < s.size(); i += 2*k){
            //已经得到区间[i, i+2k],现在要对[i, i+k)进行反转
            //确保i+k在数组长度范围内
            if(i + k <= s.size()){
                reverse(s, i, i + k - 1); //够i+k时在这里处理,记得减1,要不然就是反转2k个
                continue;//结束本次循环
            }
            //尾部不够i+k时,就把剩下的都反转
            reverse(s, i, s.size() - 1);   //同理,记得减1,要不然就是反转2k个而不是前k个
        }
        return s;
    }
};
注意点

1、for循环条件不要下意识的写 i++

2、swap交换与用temp交换本质上是一样的

标签:字符,01,int,反转,II,字符串,个字符,2k
From: https://www.cnblogs.com/DAYceng/p/17107073.html

相关文章

  • 【LeetCode字符串#02】替换空格,reserve和resize的区别分析
    替换空格力扣题目链接(opensnewwindow)请实现一个函数,把字符串s中的每个空格替换成"%20"。示例1:输入:s="Wearehappy."输出:"We%20are%20happy."思路一个错误......
  • javascript 提取字符串方法 slice substr substring
    本文将对javascript提取字符串的三个方法slice/substr/substring,进行分析。这三个方法都具有提取字符串的功能,且都有两个参数。下面将详细介绍三个方法在一些特殊参数值......
  • 各县区数字普惠金融指数数据(2014-2022)
    各县区数字普惠金融指数数据(2014-2022)各县区数字普惠金融指数数据(2014-2022)各县区数字普惠金融指数数据(2014-2022)最新版数据已整理为Excel格式,数据的时间区间为2014-2022年,......
  • 012_整合第三方技术(整合Junit)
     名称:@SpringBootTest类型:测试类注解位置:测试类定义上方作用:设置JUnit加载的SpringBoot启动类示例:    ......
  • [蓝桥杯 2019 省 A] 组合数问题-Lucas定理、数位dp
    洛谷的题目链接:https://www.luogu.com.cn/problem/P8688Lucas定理,把\(k|binom{i}{j}\)转换成在k进制下存在某个数位i比j小,再转换成反面计算每一位i都比j大,然后就是经典......
  • 《Terraform 101 从入门到实践》 第二章 Providers插件管理
    《Terraform101从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。不怕出身低,行行出状元。插......
  • 字符串随记
    一、Border和周期1.对于字符串\(S\),若其最小整周期不为\(|S|\),则最小整周期为最小周期。证明:考虑反证法。易知最小整周期\(p\le\frac{|S|}{2}\)。若存在周期\(q......
  • 01-顺序表-目录
    第一章:顺序表kx00001-顺序表--可扩容顺序表头文件相关定义:https://www.cnblogs.com/kxwslmsps/p/17106604.html......
  • kx00001-顺序表--可扩容顺序表头文件相关定义
    公共头文件:myhead.h#ifndef__MYHEAD_H__#define__MYHEAD_H__#include<cstdio>#include<cstdlib>#include<cstring>#include<cassert>/***************......
  • 【2023-01-29】连岳摘抄
    23:59人生在世,都有一份作业。                                           ......