ch4-1~ch4-3 字符串反转

1. lc 344 字符串反转

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

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O ( 1 ) O(1) 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”]

1.1 code

#include "vector"
#include "string"

using namespace std;

void reverseString(vector<char>& s){
    for(int i = 0, j = s.size() -1;  i < s.size()/2;  i++, j--) swap(s[i], s[j]);

}

2. lc541 反转II

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

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

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

示例:

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

2.1 分析

题目的思想,是每 2k 长度为一个区间, 反转其中的 前k 个字符;

若长度不足 k, 则将其区间全部反转;

i +k < s.size() : 表明还没有到达最后一个区间位置,

2.2 code


using namespace std;


class Solution{
public:
        void  reverseString(string& s,int start, int end){
            for(int i = start, j = end;  i < j; i++, j-- ){
                swap(s[i], s[j]);
            }
        }

        string reverseStr(string s, int k){
            // 开始移动区间, 每次移动2k 个长度;
            for(int i = 0; i < s.size(); i += (2*k)){
                //  假如当前区间长度 前K 个字符仍在字符串以内,  则交换 前K 个字符;
              if(i+k <= s.size() )
              {   // i 从0 开始,  i+k-1;
                  reverseString(s, i, i + k -1 );
                 // 注意, 反转一次便跳出当前循环,
                 continue;
              }
              //  否则的化,  表明当前区间, 前k个字符超过字符串, 即当前区间不足k个字符, 反转所有字符;
                reverseString(s, i, s.size() -1);
            }
            return s;
        }
};

3. 替换空格

替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”

3.1 思路

  1. 先统计原数组中空格的个数;

  2. 使用 s.resize 对原字符串字符串数组进行扩容, 扩容后的大小有count 和原数组求出;

  3. 然后使用 指针的方法, 从后往前 开始遍历, i 指向原数组的末尾, j指向新数组的末尾;

注意,这里为什么是 从后向前开始遍历呢?

  • 不用申请新数组。
  • 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
#include "string"

using namespace std;

class Solution{
public:
    string replaceSpace(string s){
        int len1 = s.size();
        // 1. 遍历原数组, 统计出其中的空格数目;
        int count = 0;
        for(int i = 0; i < s.size(); i++){
            if( s[i] == ' ') count++;
        }
        //  2. 对原字符数组扩容;
        s.resize(len1+ count *2 );
        int len2 = s.size();

        // 3. 使用双指针,开始移动字符串元素, i 从原字符串末尾位置开始, j 从新字符串末尾位置开始;
        int i = len1 -1, j = len2 -1 ;
        for(; i < j; i--, j--){ // 当两个指针没有相遇时继续 移动; 表明仍有空格;
            if(s[i] != ' '){
                s[j] = s[i];
            }else{
                s[j] = '0', s[j-1] = '2', s[j-2] = '%';
                j -= 2;
            }
        }
        return s;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值