一. 选择题 30 道

瞎蒙,花了 30 分钟。。。

二. 问答题 1 道

衡量两个向量的相似性的方法及计算方式

三. 系统设计题 1 道

设计一个能准确预估搜索广告点击率的系统

四. 编程题 2 道

1. 最长回文 01 子串 100% AC

题目:给定一个只有 0、1 组成的字符串,返回最长的回文 01 子串(回文串,且同时包含 0、1 两种字符的子串)

示例:

  1. 输入:111010010100
  2. 输出:8
  3. 解释:中间的 10100101

中心扩展法:只是对每个回文串需要判断是否同时包含 0、1 两种字符

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str;
  7. cin >> str;
  8. int len = str.size();
  9. int result = 0;
  10. int mid1 = 0;
  11. int mid2 = 0;
  12. while(mid1 < len && mid2 < len)
  13. {
  14. int left = mid1;
  15. int right = mid2;
  16. bool flag0 = false;
  17. bool flag1 = false;
  18. while(left >= 0 && right < len && str[left] == str[right])
  19. {
  20. if(str[left] == '0')
  21. flag0 = true;
  22. if(str[left] == '1')
  23. flag1 = true;
  24. --left;
  25. ++right;
  26. }
  27. int len = right - left - 1;
  28. if(flag0 == true && flag1 == true && len > result)
  29. result = len;
  30. if(mid1 == mid2)
  31. ++mid2;
  32. else
  33. ++mid1;
  34. }
  35. cout << result << endl;
  36. return 0;
  37. }

2. 礼物组合数 100% AC

题目:有 a、b 两种礼物,组合打包售卖,有两种组合方式

  1. x 件 a + y 件 b
  2. x 件 b + y 件 a

希望组合数越多越好,求最多多少个组合?

示例:

  1. 输入:a = 10, b = 12, x = 2, y = 5
  2. 输出:3
  1. 输入:a = 1, b = 1, x = 2, y = 2
  2. 输出:0
  1. 输入:a = 7, b = 8, x = 1, y = 2
  2. 输出:5

解法:

  1. 开始试了下特殊情形,直接 cout << ((a + b) / (x + y)) << endl; 竟然过了 55%
  2. 然后用二维 dp 做,只能过 27%,提示 RunTime Error,应该超时了?
    1. 动态规划数组 dpdp[i][j] 代表当前剩余 iajb 的最大组合数
    2. 状态转移方程:dp[i][j] = max(dp[i - x][j - y] + 1, dp[i - y][j-x] + 1),当然下标差值都要大于等于 0,否则就为 0
    3. 初始化:全部初始化为 0
      1. dp[i][0] = 0
      2. dp[0][j] = 0 ```cpp

        include

        include

        using namespace std;

int main() { int a, b, x, y; cin >> a >> b >> x >> y;

  1. vector<vector<int>> dp(a + 1, vector<int>(b + 1, 0));
  2. for(int i = 1; i <= a; ++i)
  3. {
  4. for(int j = 1; j <= b; ++j)
  5. {
  6. int val1 = (i - x >= 0 && j- y >= 0) ? dp[i - x][j - y] + 1 : 0;
  7. int val2 = (i - y >= 0 && j- x >= 0) ? dp[i - y][j - x] + 1 : 0;
  8. dp[i][j] = max(val1, val2);
  9. }
  10. }
  11. cout << dp[a][b] << endl;
  12. return 0;

}

  1. 3. 直接模拟(贪心),过了 100%。。。
  2. - 每次 ab 两者中较大的减去 xy 中较大的,ab 两者中较小的减去 xy 中较小的
  3. ```cpp
  4. #include <iostream>
  5. #include <vector>
  6. using namespace std;
  7. int main()
  8. {
  9. int a, b, x, y;
  10. cin >> a >> b >> x >> y;
  11. if(x == y)
  12. cout << min(a / x, b / y) << endl;
  13. else
  14. {
  15. int large = max(x, y);
  16. int small = min(x, y);
  17. int cnt = 0;
  18. while(true)
  19. {
  20. int numL = max(a, b);
  21. int numS = min(a, b);
  22. if(numL < large || numS < small)
  23. break;
  24. else
  25. {
  26. numL -= large;
  27. numS -= small;
  28. a = numL;
  29. b = numS;
  30. ++cnt;
  31. }
  32. }
  33. cout << cnt << endl;
  34. }
  35. return 0;
  36. }