undefined

  1. 给定一个字符串“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. 考虑有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; // 等价于 if(x - borrow - y < 0) { z = (x - borrow - y + 10) % 10;} else { z = x - borrow - y; }
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;
}
  1. 某一个大文件被拆成了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); // 为了让父进程处于 wait状态
printf("pid=%d, hello world\n", getpid());
exit(3);
}
}
return 0;
}
  1. 考虑后台有一些用户进行特定操作的统计数据,每项统计数据的格式为一个时间段[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;
}
};