• 笔试面试相关记录(5)


    (1)给定一个字符串,含有大写、小写字母,空格,数字,需要将其变为满足如下条件:

    所有的数字需要换成空格,并且字符串的头尾不包含空格,且整个字符串不包含连续的两个空格。

    (2)给定n,k,L,R,接下拉n个数字,要从中选出某个序列,这个序列满足如下条件:

    对于整个数组中的任意的k个连续的子数组,所选出的子序列必须包含子数组中的x个数字,其中x>=1 && x <= R;求所有满足条件的子序列的序列和(序列和就是序列中所有元素的数字相加)

    示例

    3 2 1 2

    8 3 4 

    输出48

    (3)排雷:每次只能排去正方形的四个角的雷,如果雷的数目不够四个或者不在正方形的四个角,则不能排雷,输入数据为n行a b,其中a b表示雷的位置,求可以排雷的最大数目。

    例如输入

    8
    0 0
    0 1
    1 0
    1 1
    2 0
    2 1
    10 0
    10 1
    输出4,最多可以拍雷四个。

    (4)给定一个字符串如下3(a2(c))3(a)2(bc),其中n(str)表示str出现n次,其中n > 0 && n < 10,将其还原为原始字符串。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main() {
    7. string str;
    8. while (cin >> str) { // 注意 while 处理多个 case
    9. int len = str.size();
    10. stack stk;
    11. int i = 0;
    12. while(i < len) {
    13. if (str[i] == ')') {
    14. string t;
    15. while (stk.top() != "(") {
    16. t += stk.top();
    17. stk.pop();
    18. }
    19. // 取出(
    20. stk.pop();
    21. // 取出数字
    22. // 3(a2(c)) 3(a) 2(bc)
    23. string n = stk.top();
    24. stk.pop();
    25. if (n.find_first_of("123456789") != string::npos) {
    26. // 是数字
    27. int times = n[0] - '0';
    28. string orign = t;
    29. for (int k = 0; k < times-1; k++) {
    30. t += orign;
    31. }
    32. }
    33. if (stk.size()) {
    34. string c = stk.top();
    35. if (c != "(") {
    36. t = c + t;
    37. stk.pop();
    38. }
    39. }
    40. stk.push(t);
    41. i++;
    42. } else {
    43. if (str[i] == '(') {
    44. stk.push("(");
    45. i++;
    46. } else if(isdigit(str[i])) {
    47. stk.push(to_string(str[i]-'0'));
    48. i++;
    49. } else {
    50. string l = "";
    51. while (isalpha(str[i])) {
    52. l += str[i];
    53. i++;
    54. }
    55. stk.push(l);
    56. }
    57. }
    58. }
    59. cout << stk.top() << endl;
    60. }
    61. }

    (5)给一串数字,例如 9 8 5 6 3 2 4 1 7 0,第一个数字表示后面数字的个数,后面的数字都不重复,求出最小的峰值数,如果没有就输出-1(峰值数表示其值比左右两边都大的数字);

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main() {
    6. string str;
    7. while (std::getline(std::cin, str)) { // 注意 while 处理多个 case
    8. int len = str.size();
    9. vector<int> nums;
    10. int left = 0, t = 0;
    11. while (left < len) {
    12. if (isdigit(str[left])) {
    13. t = t*10 + (str[left]-'0');
    14. } else {
    15. nums.push_back(t);
    16. t = 0;
    17. }
    18. left++;
    19. }
    20. nums.push_back(t);
    21. // for (int i = 0; i < nums.size(); i++) {
    22. // cout << nums[i] << "-";
    23. // }
    24. int min_head = 1e8;
    25. for (int i = 2; i < nums.size()-1; i++) {
    26. if (nums[i] > nums[i-1] && nums[i] > nums[i+1] && nums[i] < min_head) {
    27. min_head = nums[i];
    28. }
    29. }
    30. if (min_head == 1e8) {
    31. cout << -1 << endl;
    32. } else {
    33. cout << min_head << endl;
    34. }
    35. }
    36. }

    (6) 

    1. int a = 1;
    2. int &ra = a;
    3. int* pa = &a;
    4. int* pb = new int(a);
    5. a = 2;
    6. cout << *pa <<" " << *pb << endl;
    7. 输出2 1

    (7)

    1. void func(char*) {
    2. cout << "char *" << endl;
    3. }
    4. void func(int) {
    5. cout << "int" << endl;
    6. }
    7. int main()
    8. {
    9. func(nullptr);
    10. return 0;
    11. }
    12. 输出char *

    (8)

    已知一个按照递增顺序排列的整数数组nums和一个目标值target,找出给定目标值在数组中的开始位置和结束位置。

    要求:

    1.时间复杂度O(log n)

    2.空间复杂度O(1)

    示例:

    输入:nums=[3,5,5,8,8,8,10],target=8

    输出:[3,5]

    输入:nums=[3,5,5,8,8,8,10],target=9

    输出:[-1,-1]

    答题模板

    class Solution {

    public:

       vector searchRange(vector& nums, int target) {

       }

    1. #include
    2. #include
    3. using namespace std;
    4. int searchleft(vector<int>& nums, int target) {
    5. int left = 0, right = nums.size()-1;
    6. while (left < right) {
    7. int mid = (left+right)>>1;
    8. if (nums[mid] >= target) {
    9. right = mid;
    10. } else {
    11. left = mid+1;
    12. }
    13. }
    14. if (nums[left] == target) return left;
    15. return -1;
    16. }
    17. int searchright(vector<int>& nums, int target) {
    18. int left = 0, right = nums.size()-1;
    19. while(left < right) {
    20. int mid = (left+right)>>1;
    21. if (nums[mid] <= target) {
    22. left = mid+1;
    23. } else {
    24. right = mid-1;
    25. }
    26. }
    27. return left;
    28. }
    29. vector<int> searchRange(vector<int>& nums, int target) {
    30. int left = searchleft(nums, target);
    31. vector<int> ans(2, 0);
    32. if (left == -1) {
    33. ans[0] = -1;
    34. ans[1] = -1;
    35. return ans;
    36. }
    37. int right = searchright(nums, target);
    38. ans[0] = left;
    39. ans[1] = nums[right] == target ? right:right-1;
    40. return ans;
    41. }
    42. int main() {
    43. vector<int> nums{3, 5, 5, 8, 8, 8, 8, 10};
    44. int target = 3;
    45. vector<int> ans = searchRange(nums, target);
    46. cout << ans[0] << " " << ans[1];
    47. system("pause");
    48. return 0;
    49. }

    (9)给你一个整数数组coins, 表示不同面额的硬币,以及一个整数amount,表示总金额。
    计算并返回可以凑成总金额所需的 最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。
    你可以认为每种硬币的数量是无限的。
    要求:时间复杂度O(Sn), S是金额,n是面额数

    数值范围:
    1 <= coins.length <= 12
    0 <= amount <= 10^4

    【测试用例】
    输入:coins = [1, 2, 5], amount = 11
    输出:3
    输入:coins = [2], amount = 3
    输出:-1
    输入:coins = [1], amount = 0
    输出:0

    【参考函数】
    int coinChange(vector& coins, int amount) {}

    1. #include
    2. #include
    3. using namespace std;
    4. int coinChange(vector<int>& coins, int amount) {
    5. vector<int> dp(amount+1, 1e9);
    6. // 总价为0时,需要0张
    7. dp[0] = 0;
    8. int len = coins.size();
    9. for (int i = 0; i < len; i++) {
    10. for (int j = coins[i]; j <= amount; j++) {
    11. dp[j] = min(dp[j], dp[j-coins[i]] + 1);
    12. }
    13. }
    14. if (dp[amount] == 1e9) {
    15. return -1;
    16. }
    17. return dp[amount];
    18. }
    19. int main() {
    20. vector<int> coins{1,2,5};
    21. int amount = 11;
    22. cout << coinChange(coins, amount);
    23. system("pause");
    24. return 0;
    25. }

    (10)

    你参与了一个微信小游戏的研发,策划同学计划给你发布n项任务,每项任务会有一个 发布时间点r 和 预估处理时长p ,你需要等待任务发布后才能开始编码实现,同时每项任务都会有一位测试同学跟进测试工作,你需要合理安排工作,让所有测试同学等待的时间之和最少,此外你作为一个资深的程序员,多项任务可以交替进行。
    输入:n r1 p1 ... rn pn
    输出:各项任务的任务id和完成时间,任务id从下标1开始,按完成时间升序排列
    比如
    输入:2 1 4 3 1
    即发布2项任务,任务1的发布时间点r=1,处理时长p=4;任务2的发布时间点r=3,处理时长p=1,合理的工作安排如下图所示:

    输出:
    2 4
    1 6
    测试同学等待的总时长为10
                                                            

    image.png

    【测试用例】
    输入:2 1 4 3 1
    输出:
    2 4
    1 6
    输入:3 3 3 4 1 1 7
    输出:
    2 5
    1 7
    3 12
    输入:2 5 2 3 1
    输出:
    2 4
    1 7
    【题目1】请简要阐述解题思路(12分)
    【题目2】编写相应的程序实现(24分)
    【参考函数】
    struct Task {
       int i;          // 任务id
       int r, p;       // 发布时间,处理时长
    };
    vector> processTasks(vector& tasks) {}

    思路:按照结束时间最早进行排序,这个时候的顺序就是最终的任务执行的顺序,因为多项任务交替进行,每一个任务都有一个测试人员,要让所有测试人员等待最小的时间,需要让 能够最先完成的任务最先完成,如果最先完成的没有在最开始完成,那么它带来的延迟会加到其他所有的测试人员上。(个人思路,不确定是不是正确的)

     

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. struct Task {
    6. int i;
    7. int r, p;
    8. };
    9. static bool cmp(Task& t1, Task& t2) {
    10. return t1.r + t1.p < t2.r + t2.p;
    11. }
    12. vectorint>> processTasks(vector& tasks) {
    13. int last_start = tasks[0].r;
    14. vectorint>> ans;
    15. int len = tasks.size();
    16. // 此时第一个任务就是最先完成的任务,直接放入ans中
    17. ans.push_back({tasks[0].i, tasks[0].r + tasks[0].p});
    18. // 遍历剩下的任务
    19. for (int i = 1; i < len; i++) {
    20. // 分三种情况
    21. if (tasks[i].r < last_start) {
    22. int diff = last_start - tasks[i].r;
    23. last_start = tasks[i].r;
    24. ans.push_back({tasks[i].i, ans.back()[1] + tasks[i].p - diff});
    25. } else if (tasks[i].r > tasks[i-1].r + tasks[i].p) {
    26. ans.push_back({tasks[i].i, ans.back()[1] + tasks[i].p});
    27. } else {
    28. int diff = tasks[i].r - (tasks[i-1].r + tasks[i-1].p);
    29. last_start += diff;
    30. ans.push_back({tasks[i].i, ans.back()[1] + diff + tasks[i].p});
    31. }
    32. }
    33. return ans;
    34. }
    35. int main() {
    36. int n;
    37. cin >> n;
    38. vector tasks(n);
    39. for (int i = 0; i < n; i++) {
    40. cin >> tasks[i].r;
    41. cin >> tasks[i].p;
    42. tasks[i].i = i+1;
    43. }
    44. sort(tasks.begin(), tasks.end(), cmp);
    45. // for (int i = 0; i < n; i++) {
    46. // cout << tasks[i].r << " " << tasks[i].p << endl;
    47. // }
    48. vectorint>> ans = processTasks(tasks);
    49. for (int i = 0; i < ans.size(); i++) {
    50. cout << ans[i][0] << " " << ans[i][1] << endl;
    51. }
    52. system("pause");
    53. return 0;
    54. }

     

  • 相关阅读:
    Redis - 底层数据结构
    【广州华锐互动】VR可视化政务服务为公众提供更直观、形象的政策解读
    纯Python实现遗传算法
    Docker 安装
    SQL连接查询优化[姊妹篇.第五弹]
    Centos7快速安装跳板机jumpserver
    container/heap使用指南
    三十六、java版 SpringCloud分布式微服务云架构之Java 泛型
    数据分析-numpy2
    leetcode 48. 旋转图像(对矩阵的对角、左右旋转)
  • 原文地址:https://blog.csdn.net/wj617906617/article/details/132922057