代码随想录day08

● 344.反转字符串

采用双指针法。

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

● 541. 反转字符串II

通过自定义reverse函数与系统提供的reverse函数完成字符串的反转,其中系统调用的字符串函数为左闭右开。 引用类型的定义能够使传入的数据在内部进行修改,而不是通过创建变量的副本进行修改值。

class Solution {
public:
    void reverse_(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) {
       for (int i = 0; i < s.size(); i+=(2*k)){   
        // 1. 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
        // 2. 如果剩余字符少于 k 个,则将剩余字符全部反转。
            if (i+k <= s.size()){
                //reverse(s.begin()+i, s.begin()+i+k);
                reverse_(s, i, i+k-1);
            } else{
                //reverse(s.begin()+i, s.end());
                reverse_(s, i, s.size()-1);
            }
       }
       return s;
    }
};

● 剑指Offer 05.替换空格

相关字符串api的使用:resize()扩充原字符串长度。
目前许多数组填充问题采取的方式都是从后往前填充扩容大小,然后再对元素操作,好处有:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
class Solution {
public:
   string replaceSpace(string s) {
       // 遍历看有多少 空格
       int count = 0;
       int oldlen = s.size() - 1;
       for (int i = 0; i < s.size(); i++){
           if (s[i] == ' '){
               count++;
           }
       }
       s.resize(s.size() + 2*count);
       int newlen = s.size() - 1;
       for (int i = oldlen, j = newlen; 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;
   }
};

● 151.翻转字符串里的单词

  分三步走:1.去除前后及冗余空格;2.整个区间反转 3.按照空格控制,局部区间反转

void reverseFunc(string &s, int start, int end){
        for (int i  = start, j = end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }
    // 快慢指针
    void removeSpace(string & s){
        int slow = 0;
        for (int i = 0; i < s.size(); i++){
            if (s[i] != ' '){
                // 手动加入空格
                if (slow > 0)   s[slow++] = ' ';
                while (i < s.size() && s[i] != ' ')     // 这个判断终止条件
                {
                    s[slow++] = s[i++];
                }
                
            }
        }
        s.resize(slow);
    }

    string reverseWords(string s) {
        removeSpace(s);
        reverseFunc(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); i++){
            if (s[i] == ' ' || i == s.size()){
                 reverseFunc(s, start, i-1);
                start = i+1;
            }
        }
        return s;
    }

剑指Offer58-II.左旋转字符串

  这样旋转的实现,通过两个区间分别的reverse,然后再通过全局的reverse实现左旋的实现。

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.begin() + n);
        reverse(s.begin()+n, s.end());
        reverse(s.begin(), s.end());
        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值