给定一个字符串“abcdefg”,试实现函数 void remove(char* s, char x), 将原输入字符串s中与x相等的字符删除
1 2 3 4 5 6 7 8 9 10
| void remove(char* s, char x) { char* ptr = s; while (*s != '\0') { if (*s != x) { *ptr++ = *s; } s++; } *ptr = *s; }
|
考虑有2个存储在 string 中的正整数(远大于int64)A和B,现请你实现一个函数 std::string minus_hp(const std::string &A, const std::string &B),计算A-B的结果,
如: 11111111111111111111111 - 11111111111111111111110 = 1
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
| std::string sub(const std::string& A, const std::string& B) { std::string res = ""; int borrow = 0; int i = A.size() - 1, j = B.size() - 1; while (i >= 0 || j >= 0) { int x = i >= 0 ? (A[i] - '0') : 0; int y = j >= 0 ? (B[j] - '0') : 0; int z = (x - borrow - y + 10) % 10; res += ('0' + z); borrow = x - borrow - y < 0 ? 1 : 0; i--; j--; } reverse(res.begin(), res.end()); int k = 0; for (; k < res.size()-1; k++) { if (res[k] != '0') break; } return res.substr(k); }
bool check_less(const std::string& A, const std::string& B) { if (A.size() == B.size()) return A < B; return A.size() < B.size(); }
std::string minus_hp(const std::string &A, const std::string &B) { std::string res; if (check_less(A, B)) { res = sub(B, A); res.insert(0, "-"); } else { res = sub(A, B); } return res; }
|
- 某一个大文件被拆成了N个小文件,每个小文件编号从0至N-1,相应大小分别记为S(i)。给定磁盘空间为C,试实现一个函数从N个文件中连续选出若干个文件拷贝到磁盘中,使得磁盘剩余空间最小。
函数定义如下:int MaximumCopy(const std::vector &s, size_t C, size_t &start_index, size_t &end_index);
函数返回值为剩余空间,如无解返回-1。其中start_index, end_index为文件的编号。
如N=5,S = {1, 2, 3, 5, 4},C = 7
结果为start_index = 0, end_index = 2, return = 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int MaximumCopy(const std::vector<size_t> &s, size_t C, size_t &start_index, size_t &end_index) { int i = 0, j = -1; int sum = 0; int free_space = INT_MAX; while (j < s.size()) { if (sum <= C) { j++; sum += s[j]; free_space = std::min(free_space, C-sum); if (free_space == C-sum) { start_index = i; end_index = j; } } else { i++; sum -= s[i]; } } return free_space == INT_MAX ? -1 : free_space; }
|
4.实现一段多进程代码,父进程创建3个子进程,在每个子进程创建成功之后父进程打印如下信息: “pid=%d forked”,在每个子进程退出之后父进程打印如下信息”pid=%d, exited”(其中pid=%d对应相应子进程的进程号)。每个子进程内打印如下信息: “pid=%d, hello world”(其中pid=%d对应自己的进程号)。
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
| pid_t pids[3] = {0};
void* pth(void* arg) { pid_t pid = wait(NULL); printf("pid=%d, exited\n", pid); }
int main() { int i = 0, j = 0; pthread_t tids[3] = {0}; for (i = 0; i < 3; i++) { pids[i] = fork(); if (pids[i] < 0) { std::cout << "create process failed, exit" << std::endl; exit(1); } else if (pids[i] > 0) { printf("pid=%d forked\n", pids[i]); if (pthread_create(&tids[i], NULL, pth, NULL) == -1) { std::cout << "create pthread failed" << std::endl; exit(2); } } else { sleep(1); printf("pid=%d, hello world\n", getpid()); exit(3); } } return 0; }
|
- 考虑后台有一些用户进行特定操作的统计数据,每项统计数据的格式为一个时间段[a,b](包括a、b)。由于对于每个用户上报的数据都比较多,并且有些时间段是有重叠的,现请你写一个处理工具,将有重叠的时间段合并。
如:
输入为:[7,9] [8,10] [5,8] [1,3],[2,4]
输出为:[1,4] [5, 10]
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
| bool Compare(vector<int>& left, vector<int>& right) { if (left[0] < right[0]) return true; else if (left[0] == right[0]) if (left[1] < right[1]) return true; return false; }
class Solution {
public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.empty()) return vector<vector<int>>(); sort(intervals.begin(), intervals.end(),Compare); std::vector<vector<int>> res; vector<int> vec; vec.push_back(intervals[0][0]); for (int i = 0; i < intervals.size()-1; ++i) { if (intervals[i][1] >= intervals[i + 1][0]) { if (intervals[i][1] > intervals[i + 1][1]) intervals[i + 1][1] = intervals[i][1]; } else { vec.push_back(intervals[i][1]); res.push_back(vec); vec.clear(); vec.push_back(intervals[i + 1][0]); } } vec.push_back(intervals[intervals.size() - 1][1]); res.push_back(vec); return res; } };
|