当前位置:   article > 正文

C++笔试强训day10

C++笔试强训day10

目录

1.最长回文字符串

2.买卖股票的最好时机(一)

3.过河卒


1.最长回文字符串

链接

一开始没认真看题目,直到提交了好几遍没过还是没去检查题目,一直检查代码逻辑,哎呦,难受了。

我以为是收尾字母相同就行了。

错误代码:

  1. #include <algorithm>
  2. class Solution {
  3. public:
  4. int getLongestPalindrome(string A) {
  5. if (A.size() == 1 || A.size() == 0)
  6. return A.size();
  7. int len = 0;
  8. int r = A.size() - 1;
  9. for (int i = r; i >= 0; --i) {
  10. for (int j = 0; j <= r; ++j) {
  11. if (A[i] == A[j]) {
  12. int newlen = i - j + 1;
  13. len = max(len, newlen);
  14. break;
  15. }
  16. }
  17. }
  18. return len;
  19. }
  20. };

正解:

双指针往该数的两边同时走,然后一直更新len就好了。

核心代码:

  1. for (int i = 1; i < A.size(); ++i) {
  2. l = i - 1;
  3. r = i + 1;
  4. while (l >= 0 && r < n) {
  5. if (A[l] == A[r]) {
  6. l--;
  7. r++;
  8. }
  9. else {
  10. break;
  11. }
  12. }
  13. len = max(len, r - l - 1);

细节:不确定是不是两数连一起相同,比如ababa 和 abaabc。

如果只用上述核心代码的话,就不能准确的计算出abaabc的长度了,因为他只是比他的前后。

要添加一个本身也计算的核心

  1. for (int i = 1; i < A.size(); ++i) {
  2. l = i - 1;
  3. r = i + 1;
  4. while (l >= 0 && r < n) {
  5. if (A[l] == A[r]) {
  6. l--;
  7. r++;
  8. }
  9. else {
  10. break;
  11. }
  12. }
  13. len = max(len, r - l - 1);
  14. l = i - 1;
  15. r = i;
  16. while (l >= 0 && r < n) {
  17. if (A[l] == A[r]) {
  18. l--;
  19. r++;
  20. }
  21. else {
  22. break;
  23. }
  24. }
  25. len = max(len, r - l - 1);

这样就能保证另一种也能过。

详细代码:

  1. class Solution {
  2. public:
  3. int getLongestPalindrome(string A) {
  4. int n = A.size();
  5. if (n < 2) {
  6. return n;
  7. }
  8. int len = 0;
  9. int l, r;
  10. for (int i = 1; i < A.size(); ++i) {
  11. l = i - 1;
  12. r = i + 1;
  13. while (l >= 0 && r < n) {
  14. if (A[l] == A[r]) {
  15. l--;
  16. r++;
  17. }
  18. else {
  19. break;
  20. }
  21. }
  22. len = max(len, r - l - 1);
  23. l = i - 1;
  24. r = i;
  25. while (l >= 0 && r < n) {
  26. if (A[l] == A[r]) {
  27. l--;
  28. r++;
  29. }
  30. else {
  31. break;
  32. }
  33. }
  34. len = max(len, r - l - 1);
  35. }
  36. return len;
  37. }
  38. };

2.买卖股票的最好时机(一)

链接

我的一开始的解法是用队列存储一个pair<int, int>一个存值,一个存下标。

然后暴力枚举每个组合,最后肯定是超时了。

正解就是一边遍历数组,一边更新下标 i 之前的最小值Min,同时更新总值sum。

详细代码:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int sum = 0;
  5. int main() {
  6. int n;
  7. cin >> n;
  8. vector<int> v(n);
  9. for (int i = 0; i < n; ++i)
  10. {
  11. cin >> v[i];
  12. }
  13. int Min = v[0];
  14. for (int i = 1; i < n; ++i)
  15. {
  16. if (v[i] - Min > sum)
  17. {
  18. sum = v[i] - Min;
  19. }
  20. Min = min(Min, v[i]);
  21. }
  22. cout << sum << endl;
  23. return 0;
  24. }

3.过河卒

链接

一道线性加约束条件dp问题。

细节:x1 != x,y2 != y,dp数组的初始化

处理好这些细节之后,解题就不容易出错。

详细代码:(我这里是将所有坐标挪动了1位,即起点在1,1;所以马的位置x,y也都要+=上一个数字1

  1. #include <iostream>
  2. using namespace std;
  3. int n, m, x, y;
  4. long long dp[30][30];
  5. int main()
  6. {
  7. cin >> n >> m >> x >> y;
  8. x++, y++;
  9. dp[0][1] = 1;
  10. for(int i = 1; i <= n + 1; i++)
  11. {
  12. for(int j = 1; j <= m + 1; j++)
  13. {
  14. if(i != x && j != y && ((abs(i - x) + abs(j - y)) == 3) || (i == x && j == y))
  15. dp[i][j] = 0;
  16. else
  17. dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
  18. }
  19. }
  20. cout << dp[n + 1][m + 1] << endl;
  21. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/563527
推荐阅读
相关标签
  

闽ICP备14008679号