Leetcode string 344 541

文章介绍了LeetCode中涉及字符串反转和数组旋转的几道经典问题,包括344号问题的双指针交换、541号问题的间隔反转、05号问题的空格替换以及151号问题的单词反转。解决方案涵盖了不同的策略,如直接使用库函数、双指针法以及分步反转等。

Leetcode 344

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0;
        int right = s.size()-1;
        while(left <= right){
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
};

用两个指针分别指向左右两端,交换他们的值

如果题目中revers是不重要的部分可以直接用reverse函数

Leetcode 541 Reverse String2

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0; i<s.size(); i+=2*k){
            if(i+k <= s.size()){
                int left = i;
                int right = i+k-1;
                while(left<right){
                    swap(s[left], s[right]);
                    left++;
                    right--;
                }
            }else{
                reverse(s.begin()+i,s.end());
            }
        }
        return s;
    }
};

重点是想到每次i要移动2k,然后在一次循环中反转2k个值

剑指offer05 替换空格

  1. 暴力解法

public:
    string replaceSpace(string s){
        string newString;
        for(int i=0; i<s.size(); i++){
            char c = s.at(i);
            if(c == ' '){
                newString.append("%20");
            }else{
                newString.push_back(c);
            }
        }
        return newString;
    }
};

一些tips:

  1. push_back只能加一个字符

append可以加多个

  1. string.at();

  1. 不需要创建新的string

    string replaceSpace(string s){
        int count = 0;
        int oldsize = s.size();
        int newsize = 0;
        for(int i=0; i<s.size(); i++){
            if(s.at(i) == ' '){
                count++;
            }
        }

        newsize = oldsize + 2*count;
        s.resize(newsize);

        for(int i=newsize-1, j=oldsize-1; i > j; i--, j--){
            if(s[j] != ' '){
                s[i] = s[j];
            }else{
                s[i] = '0';
                s[i-1] = '2';
                s[i-2] = '%';
                i-=2;
            }
        }
        return s;
    }

注意:要从后往前遍历更改string

Leetcode 151 Reverse Words in a String

首先去除空格,然后在再反转整个句子,在反转单个单词

class Solution {
public:
    void reverse(string& s, int start, int end){
        while(start < end){
            swap(s[start], s[end]);
            start ++;
            end--;
        }
    }
    string reverseWords(string s) {
        string newString;
        for(int i=0; i<s.size(); i++){
            if((i==0 && s[i]==' ') || (i > 0 && s[i] == s[i-1] && s[i] == ' ')){
                continue;
            }else{
                newString.push_back(s[i]);
            }
        }

        while(newString.at(newString.size()-1) == ' '){
            newString.resize(newString.size()-1);
        }

        reverse(newString, 0 , newString.size()-1);
        int start = 0;
        for(int i = 0; i <= newString.size(); i++){
            if(i==newString.size() || newString[i] == ' '){
                reverse(newString, start, i-1);
                start = i+1;
            }

        } 
        return newString;
    }
};

这里去除空格是用新的string,可以用双指针法,这样就不用在建一个string

Leetcode 189 Rotate Array(与原题相似)

  1. New Array

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int arr[nums.size()];
        for(int i =0; i<nums.size(); i++){
            arr[i] = nums[i];
        }
        for(int i=0; i<nums.size(); i++){
            nums[(i+k)%nums.size()] = arr[i];
        }
    }
};
  1. 不创建新的arr

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin()+k%n);
        reverse(nums.begin()+k%n, nums.end());
    }
};

注意:

  1. reverse(start,end),反转的部分是不包括end这个值的,相当于反转的部分为[start,end)

  1. 这道题没有说k<n,所以要写k%n

反转题的小总结:

  1. 双指针法(当出现一些条件的时候,可以考虑改变循环的条件)

  1. 先反转整体,再反转局部

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值