常用的代码块

代码块

Posted by WenlSun" on May 24, 2020

大数相加(以字符串形式相加)

C++ 代码模板

1
2
3
4
5
6
7
8
9
10
11
12
13
string add(string s1, string s2) {
    int carry = 0;
    string res;
    for (int i = s1.size() - 1, j = s2.size() - 1; i >= 0 || j >= 0 || carry; i--, j--) {
        int n1 = i < 0 ? 0 : s1[i] - '0';
        int n2 = j < 0 ? 0 : s2[j] - '0';
        int sum = (n1 + n2 + carry) % 10;
        res += to_string(sum);
        carry = (n1 + n2 + carry) / 10;
    }
    reverse(res.begin(), res.end());
    return res;
}

求解给定区间中长度为k的所有框中的最大值

LeetCode239 单调队列的应用!!

C++ 代码模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    vector<int> res;
    deque<int> q;
    for (int i = 0; i < nums.size(); i++) {
        // 队列不为空,并且窗口滑动到需要出队头,则队头出队
        if (q.size() && i - k + 1 > q.front()) q.pop_front();
        // 如果队尾元素小于等于当前元素,则队尾元素出队
        while (q.size() && nums[q.back()] <= nums[i]) q.pop_back();
        // 否则将当前元素入队
        q.push_back(i);
        // 如果窗口大小达到k了,则开始输出结果
        if (i >= k - 1) res.push_back(nums[q.front()]);
    }
    return res;
}

求解给定区间中长度为k的所有框中和的最大值

C++ 代码模板

1
2
3
4
5
6
7
8
9
10
int maxSum(vector<int>& nums, int k) {
    int sum = 0, res;
    for (int i = 0; i < k; i++) sum += nums[i];
    res = sum;
    for (int i = k; i < nums.size(); i++) {
        sum += nums[i] - nums[i-k];
        res = max(res, sum);
    }
    return res;
}

判断一个字符串是否包含重复字符

一般可以利用哈希表来统计每一个字符出现的次数,可以使用位压缩来替代哈希表

  1. 使用一个32位的int数来存储字符串的状态,初始化为0,即每一位都是0,0-25位分别表示a-z
  2. 每一个c先通过1 << c-'a'获取对应的位,然后判断该位置是否是0,若是0则更新状态,否则返回。

C++ 代码模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool isUnique(string s) {
    unordered_set<char> st; // 哈希表
    for (auto c : s) {
        if (st.count(c)) return false;
        st.insert(c);
    }
    return true;
}

// 位压缩
bool isUnique2(string s) {
    int m = 0;
    for (auto c : s) {
        if (m & (1 << c - 'a')) return false;
        m |= (1 << c - 'a');
    }
    return true;
}

分割字符串

C++ 代码模板

1
2
3
4
5
6
7
8
9
10
11
12
vector<int> split(string s, string p) {
    vector<int> res;
    if (s.empty()) return res;
    s += p;
    int pos = s.find(p);
    while (pos != s.npos) {
        res.push_back(stoi(s.substr(0, pos)));
        s = s.substr(pos + 1);
        pos = s.find(p);
    }
    return res;
}

判断越界代码模板

C++ 代码模板

1
2
3
4
5
6
7
int res = 0;
for(auto n:nums){
    // 正数越界情况
    if(res > INT_MAX / 10 || (res == INT_MAX / 10 && n > 7)) return INT_MAX;
    // 负数越界情况
    if(res < INT_MIN / 10 || (res == INT_MIN / 10 && n < -8)) return INT_MIN;
}

枚举字符串中所有连续的段

比如字符串s = 11122233333344444555666中寻找连续的段111、222等

C++ 代码模板

1
2
3
4
5
6
for (int i = 0; i < s.size(); i++){
    int k = j;
    while (k < s.size() && s[k] == s[j]) k++;
    string t = s.substr(j, k - j);
    j = k - 1;
}