当前位置:   article > 正文

C++笔试强训day7

C++笔试强训day7

目录

1.字符串中找出连续最长的数字串

2.岛屿数量

3.拼三角


1.字符串中找出连续最长的数字串

链接

我的思路很简洁,就是双指针遍历,然后不断更新左位置left和右位置right和长度len。

然后我写代码的时候代码思路没跟上原本思路,直接把所有的l,r,len都存起来,然后最后再遍历一遍存起来的数。

回想起才发现思路清晰了,但是代码写的一塌糊涂,其实可以直接在遍历的过程中不断更新l,r,len就可以了。

一开始代码(可以通过,但是繁琐):

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. vector<pair<int, int>> vp(256);
  5. int main() {
  6. string s;
  7. cin >> s;
  8. int l = 0, r = 0;
  9. int k = 0;
  10. while (r < s.size()) {
  11. while (!(s[l] >= '0' && s[l] <= '9')) {
  12. l++;
  13. }
  14. r = l;
  15. while (s[r] >= '0' && s[r] <= '9') {
  16. r++;
  17. }
  18. vp[k++] = { l, r - 1 };
  19. l = r;
  20. }
  21. int len = 0;
  22. int keyi = 0;
  23. for (int i = 0; i < k; ++i) {
  24. if ((vp[i].second - vp[i].first + 1) > len) {
  25. len = vp[i].second - vp[i].first + 1;
  26. keyi = i;
  27. }
  28. }
  29. string t(s.begin() + vp[keyi].first, s.begin() + vp[keyi].second + 1);
  30. cout << t << endl;
  31. return 0;
  32. }

改进代码(相当于我改进思路的再改进,因为可以不用不存储右指针,因为有了左和长度就可以判断右):

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string s;
  7. cin >> s;
  8. int begin = -1, len = 0;
  9. for (int i = 0; i < s.size(); i++)
  10. {
  11. if (s[i] >= '0' && s[i] <= '9')
  12. {
  13. int j = i;
  14. while (j < s.size() && s[j] >= '0' && s[j] <= '9') j++;
  15. if (j - i > len)
  16. {
  17. begin = i;
  18. len = j - i;
  19. }
  20. i = j;
  21. }
  22. }
  23. if (begin == -1)
  24. cout << "" << endl;
  25. else
  26. cout << s.substr(begin, len) << endl;
  27. return 0;
  28. }

这样不仅代码简洁,而且看起来也舒服。

begin初始化为负 -1 是为了判断有没有更新过

2.岛屿数量

链接

非常经典的一道DFS题目。

因为我见了很多DFS的题目返回值都为bool,因此我认为DFS必须以bool作返回值,结果导致浪费很多时间还得不到成果。

用不着返回值,直接深度遍历就可以求值:

  1. class Solution {
  2. public:
  3. bool vis[220][220];
  4. int rowCount;
  5. int colCount;
  6. int dx[4] = {0,0,1,-1};
  7. int dy[4] = {1,-1,0,0};
  8. int solve(vector<vector<char>>& grid) {
  9. rowCount = grid.size();
  10. colCount = grid[0].size();
  11. // 用来记录岛屿数量
  12. int num_islands = 0;
  13. for (int row = 0; row < rowCount; row++) {
  14. for (int col = 0; col < colCount; col++) {
  15. // 如果当前位置是岛屿的一部分
  16. if (grid[row][col] == '1' && !vis[row][col]) {
  17. // 从当前位置开始执行DFS, 标记整个岛屿
  18. DFS(grid, row, col);
  19. // 岛屿数量增加
  20. num_islands++;
  21. }
  22. }
  23. }
  24. return num_islands;
  25. }
  26. void DFS(vector<vector<char>>& grid, int row, int col) {
  27. // 将当前位置标记为'0', 表示已访问
  28. vis[row][col] = true;
  29. // 检查并递归访问当前点的上下左右四个相邻点
  30. for(int i = 0; i < 4; ++i)
  31. {
  32. int x = row + dx[i];
  33. int y = col + dy[i];
  34. if(x >= 0 && x < rowCount && y >= 0 && y < colCount && !vis[x][y] && grid[x][y] == '1')
  35. DFS(grid, x, y);
  36. }
  37. }
  38. };

3.拼三角

链接

因为只有六根棍子,直接排序后分类讨论即可:

我没有经过思考,所有就把所有情况都遍历了,真的很傻的行为,虽然过了,但是很繁琐嘞,太多情况了。

自己代码:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #define int long long
  5. using namespace std;
  6. bool Check(int a, int b, int c)
  7. {
  8. int min1 = min(a, min(b, c)); // 最小
  9. int max1 = max(a, max(b, c)); // 最大
  10. int mid = a + b + c - min1 - max1;
  11. if (min1 + mid <= max1)
  12. return false;
  13. return true;
  14. }
  15. vector<int> v(6);
  16. void solve()
  17. {
  18. for (int i = 0; i < 6; ++i)
  19. {
  20. cin >> v[i];
  21. }
  22. sort(v.begin(), v.end());
  23. if (Check(v[0], v[1], v[2]))
  24. {
  25. if (Check(v[3], v[4], v[5]))
  26. {
  27. cout << "Yes" << endl;
  28. return;
  29. }
  30. }
  31. if (Check(v[1], v[2], v[3]))
  32. {
  33. if (Check(v[0], v[4], v[5]))
  34. {
  35. cout << "Yes" << endl;
  36. return;
  37. }
  38. }
  39. if (Check(v[2], v[3], v[4]))
  40. {
  41. if (Check(v[0], v[1], v[5]))
  42. {
  43. cout << "Yes" << endl;
  44. return;
  45. }
  46. }
  47. if (Check(v[0], v[2], v[5]))
  48. {
  49. if (Check(v[1], v[3], v[4]))
  50. {
  51. cout << "Yes" << endl;
  52. return;
  53. }
  54. }
  55. if (Check(v[0], v[2], v[4]))
  56. {
  57. if (Check(v[1], v[3], v[5]))
  58. {
  59. cout << "Yes" << endl;
  60. return;
  61. }
  62. }
  63. if (Check(v[0], v[2], v[3]))
  64. {
  65. if (Check(v[1], v[4], v[5]))
  66. {
  67. cout << "Yes" << endl;
  68. return;
  69. }
  70. }
  71. if (Check(v[0], v[1], v[3]))
  72. {
  73. if (Check(v[2], v[4], v[5]))
  74. {
  75. cout << "Yes" << endl;
  76. return;
  77. }
  78. }
  79. if (Check(v[0], v[1], v[4]))
  80. {
  81. if (Check(v[2], v[3], v[5]))
  82. {
  83. cout << "Yes" << endl;
  84. return;
  85. }
  86. }
  87. if (Check(v[0], v[3], v[4]))
  88. {
  89. if (Check(v[1], v[2], v[5]))
  90. {
  91. cout << "Yes" << endl;
  92. return;
  93. }
  94. }
  95. if (Check(v[0], v[3], v[5]))
  96. {
  97. if (Check(v[1], v[2], v[4]))
  98. {
  99. cout << "Yes" << endl;
  100. return;
  101. }
  102. }
  103. cout << "No" << endl;
  104. }
  105. signed main() {
  106. int t;
  107. cin >> t;
  108. while (t--)
  109. solve();
  110. }

优化代码(只剩四种情况):

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int t;
  5. int arr[6];
  6. int main()
  7. {
  8. cin >> t;
  9. while (t--)
  10. {
  11. for (int i = 0; i < 6; i++) cin >> arr[i];
  12. sort(arr, arr + 6);
  13. if (arr[0] + arr[1] > arr[2] && arr[3] + arr[4] > arr[5] ||
  14. arr[0] + arr[2] > arr[3] && arr[1] + arr[4] > arr[5] ||
  15. arr[0] + arr[3] > arr[4] && arr[1] + arr[2] > arr[5] ||
  16. arr[0] + arr[4] > arr[5] && arr[1] + arr[2] > arr[3])
  17. {
  18. cout << "Yes" << endl;
  19. }
  20. else cout << "No" << endl;
  21. }
  22. return 0;
  23. }

因为是排序过后的,所以只需要遍历包含第一个数在内的四种情况即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/519588
推荐阅读
相关标签
  

闽ICP备14008679号