有序链表归并
1 |
|
反转链表
1 |
|
Partion and Reverse List
1 | 1->2->3->4->5->6->7 |
1 |
|
单链表排序
1 | // 快排版本 |
从一个数组里取m个数,能否和为n
1 | // 类似于zeros and ones |
最大子串和
求出数组中最大的子串和,并求出子串1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using namespace std;
vector<int> helper(vector<int>& nums) {
int n = nums.size();
int ans = 0;
vector<int> temp;
vector<int> cur;
int ret = INT_MIN;
for (auto i : nums) {
ans += i;
if (ans < 0) {
ans = 0;
cur = vector<int>({});
}
else {
cur.push_back(i);
if (ret < ans) {
ret = ans;
temp = cur;
}
}
}
return temp;
}
int main() {
int n;
cin >> n;
vector<int> nums(n, 0);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
for (auto i : helper(nums)) {
cout << i << endl;
}
return 0;
}
字符串拼接最大值
一堆数字如123,324,56怎么拼接得到的值最大。
1 |
|
左边最大值
找出数组中每个数字左边部分(包括自己)最大的数字,然后返回结果数组
1 |
|
Search in Rotated Sorted Array
1 |
|
数组变化
一个数组,里面的元素全部初始为0,有以下两种操作:
- 指定一个元素+1
- 所有的*2
问到达一个数组目标值得最小操作步数。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using namespace std;
int helper(vector<int>& nums) {
int ret = 0;
int limit = INT_MAX;
for (auto i : nums) {
if (!i) continue;
else {
limit = min(limit, i);
ret ++;
}
}
int ans = 1;
while (ans * 2 <= limit) ret ++, ans *= 2;
for (auto i : nums) {
if (i) ret += i - ans;
}
return ret;
}
int main() {
int n;
cin >> n;
vector<int> nums(n, 0);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << helper(nums) << endl;
return 0;
}
顺时针打印数组
1 |
|
K个升序数组归并
1 |
|
二叉树的最近公共祖先
1 |
|
两个升序数组,查合并之后的总的中位数
1 |
|
LRU
1 |
|
带重复的字符串全排列
1 |
|
自然数排列
0123456791011121314.. 自然数这样顺次排下去,给一个index,找出对应的数字是什么1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using namespace std;
char helper(int n) {
if (!n) return '0';
if (n < 10) return '1' + (n - 1);
n -= 9;
int cnt = 1;
while (n > (pow(10, cnt + 1) - pow(10, cnt)) * (cnt + 1)) {
n -= (pow(10, cnt + 1) - pow(10, cnt)) * (cnt + 1);
cnt ++;
}
int ans = pow(10, cnt) + (n - 1) / (cnt + 1);
return to_string(ans)[(n - 1) % (cnt + 1)];
}
int main() {
for (int i = 0; i < 200; i++) {
cout << helper(i);
}
cout << endl;
return 0;
}
House Robber III
Leetcode 3371
2
3
4
5
6
7
8
9
10
11
12
13
14class Solution {
public:
int helper(TreeNode* root, int& l, int& r) {
if (!root) return 0;
int ll = 0, lr = 0, rl = 0, rr = 0;
l = max(0, helper(root->left, ll, lr));
r = max(0, helper(root->right, rl, rr));
return max(l + r, root->val + ll + lr + rl + rr);
}
int rob(TreeNode* root) {
int l, r;
return helper(root, l, r);
}
};
Minimum Window Substring
Leetcode 761
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38class Solution {
public:
string minWindow(string s, string t) {
if (t.empty()) return "";
unordered_map<char, int> m;
for (auto i : t) {
m[i] ++;
}
int ans = m.size();
int n = s.size();
int l = 0, r = 0;
int len = INT_MAX;
string ret;
while (r <= n && l <= r) {
if (ans > 0 && r < n) {
auto key = s[r++];
if (m.find(key) != m.end()) {
m[key] --;
if (m[key] == 0) ans--;
}
}
else {
auto key = s[l++];
if (m.find(key) != m.end()) {
m[key] ++;
if (m[key] == 1) ans ++;
}
}
if (!ans && r - l < len) {
len = r - l;
ret = s.substr(l, len);
}
}
return ret;
}
};
变色龙
1 | Description |
1 |
|
平方根
1 |
|
短网址系统
设计一个短网址系统?短网址生成策略?短网址和长网址的映射关系如何表示?存网址的数据库表太大了怎么办?Sharding后如何分别以长网址或短网址为主key搜索?你觉得这个系统追求的是时间效率还是空间节省?那冗余存储的牺牲值不值得?
1 | // 代码待补充 |
大文件判断重复判断
两个大文件,4g内存,判断两个文件里想同的url1
2
3
4
5
6/*
三种思路供参考:
1. 运用bitmap,类似于布隆过滤器
2. 运用hash值,类似于布隆过滤器,有可能出现判断不准确的情况
3. 分桶成小文件,然后查询过程中扫每个文件
*/
无向图的最小环
1 | 输入: |
1 |
|