大数相加(以字符串形式相加)
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;
}
|
判断一个字符串是否包含重复字符
一般可以利用哈希表来统计每一个字符出现的次数,可以使用位压缩来替代哈希表
- 使用一个32位的int数来存储字符串的状态,初始化为0,即每一位都是0,0-25位分别表示a-z
- 每一个
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;
}
|