【代码随想录】刷题笔记Day12

前言

离上一次更新已经足足2个月了,又要上班又要折腾毕业的事属实是没空,没事的期间就只想玩,科研也停滞了,想着上班摸鱼稍微有点时间,回顾一下之前的文章,重拾刷题吧就,从字符串开始咯

补充:String用法

// 定义
string str = "abcd";

// 下标访问
for(int i = 0; i < str.length(); i++){
    printf("%c",str[i]);  // 输出abcd    
}
// 迭代器访问
for(string::iterator it = str.begin(); it != str.end(); it++){
    printf("%c",*it);
}

// 常用函数
string str1 = "aa", str2 = "aaa", str3 = "aaaa";
str3 = str1 + str2;  // operator+=加法,将stx1和str2拼接,赋值给str3
if(strl < str2) printf("ok\n");  // compare operator,比较字典序
length();  // 与size()相同,返回长度
insert(pos, string);  // 在pos号位置插入字符串string
insert(it, it2, it3);  // it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上
erase(it);  // 删除单个元素,O(N)
erase(first, last);  // 删除区间所有元素,O(N)
erase(pos, length);  // pos为需要开始删除的起始位置,length为删除的字符个数。
clear();  // 清空字符串,O(1)
substr(pos, len);  // 返回从pos号位开始、长度为len的子串,O(len)
find(str2);  // 当str2是str的子串时,返回其在str中第一次出现的位置;
// 如果str2不是str的子串,那么返回string:npos,类型unsigned_int,值为-1/4294967295
find(str2, pos);  // 从str的pos号位开始匹配str2,返回值与上相同
// 以上时间复杂度为O(nm),其中n和m分别为str和str2的长度
replace(pos, len, str2);  // 把str从pos号位开始、长度为len的子串替换为str2
replace(it1, it2, str2);  // 把str的迭代器[it1,it2)范围的子串替换为str2
resize(new_size);  // 把字符串大小调整到对应大小

344. 反转字符串

  • 思路:头尾双指针交换即可
  • 【代码随想录】刷题笔记Day12_第1张图片
  • class Solution {
    public:
        void reverseString(vector& s) {
            for(int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--){
                swap(s[i], s[j]);
            }
        }
    };

 541. 反转字符串 II

  • 思路:循环每次跳2k,思路和前一道题一致
  • class Solution {
    public:
        string reverseStr(string s, int k) {
            for (int i = 0; i < s.size(); i += (2 * k)) {
                // 1. 每隔 2k 个字符的前 k 个字符进行反转
                // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
                if (i + k <= s.size()) {
                    reverse(s.begin() + i, s.begin() + i + k );
                } else {
                    // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                    reverse(s.begin() + i, s.end());
                }
            }
            return s;
        }
    };

 剑指 Offer 05. 替换空格

  • 思路:首先扩充数组到每个空格替换成"%20"之后的大小,然后从后向前替换空格
  •  套路:数组填充预扩充之后再从后往前遍历操作
  • class Solution {
    public:
        string replaceSpace(string s) {
            int count = 0; // 统计空格的个数
            int sOldSize = s.size();
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == ' ') {
                    count++;
                }
            }
            // 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
            s.resize(s.size() + count * 2);
            int sNewSize = s.size();
            // 从后先前将空格替换为"%20"
            for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
                if (s[j] != ' ') {
                    s[i] = s[j];
                } else {
                    s[i] = '0';
                    s[i - 1] = '2';
                    s[i - 2] = '%';
                    i -= 2;
                }
            }
            return s;
        }
    };

你可能感兴趣的:(代码随想录刷题笔记,笔记,leetcode,算法,数据结构,职场和发展)