当前位置:   article > 正文

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题:C-小苯的IDE括号问题(easy)_牛客小白月赛87 (nowcoder.com)

D题: D-小苯的IDE括号问题(hard)_牛客小白月赛87 (nowcoder.com)

 

 

C题代码: 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 2e5+10;
  4. int n,k;
  5. int l[N],r[N];
  6. //删除操作
  7. void remove(int x)
  8. {
  9. r[l[x]] = r[x];
  10. l[r[x]] = l[x];
  11. }
  12. int main()
  13. {
  14. cin.tie(nullptr)->ios::sync_with_stdio(false);
  15. cin >> n >> k;
  16. string s;
  17. cin >> s;
  18. //做一个标记头尾哨子
  19. s = "L" + s + "R";
  20. int pos = 0; //标记位置,用来去找鼠标I的位置
  21. for(int i=1;i<s.size();i++)
  22. {
  23. if(s[i] == 'I')
  24. {
  25. pos = i;
  26. break;
  27. }
  28. }
  29. r[0] = s.size()-1,l[s.size()-1] = 0;
  30. for(int i=1;i<s.size();i++)
  31. {
  32. //插入操作(插入指向左右指针)
  33. int left = i-1,right = r[i-1];
  34. l[i] = left,r[i] = right;
  35. l[right] = i,r[left] = i;
  36. }
  37. while(k--)
  38. {
  39. string str;
  40. cin >> str;
  41. if(str == "backspace")
  42. {
  43. if(s[l[pos]] == '(' && s[r[pos]] == ')')
  44. {
  45. remove(l[pos]);
  46. remove(r[pos]);
  47. }
  48. else{
  49. if(s[l[pos]] == 'L') continue;
  50. remove(l[pos]);
  51. }
  52. }
  53. else{
  54. if(s[r[pos]] == 'R') continue;
  55. remove(r[pos]);
  56. }
  57. }
  58. for(int i=r[0];i!=s.size()-1;i=r[i])
  59. cout << s[i];
  60. return 0;
  61. }

D题代码: 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 2e5+10;
  4. int l[N],r[N];
  5. int n,k;
  6. void remove(int x)
  7. {
  8. r[l[x]] = r[x];
  9. l[r[x]] = l[x];
  10. }
  11. int main()
  12. {
  13. cin.tie(nullptr)->ios::sync_with_stdio(false);
  14. cin >> n >> k;
  15. string s;
  16. cin >> s;
  17. s = "L" + s + "R";
  18. int pos = 0;
  19. for(int i=1;i<=n;i++)
  20. {
  21. if(s[i] == 'I')
  22. {
  23. pos = i;
  24. break;
  25. }
  26. }
  27. //这里对于C题换了一种写法,两种都可以
  28. r[0] = s.size()-1,l[s.size()-1] = 0;
  29. for (int i = 1; i <=n+1 ; i++)
  30. l[i] = i - 1, r[i - 1] = i;
  31. while(k--)
  32. {
  33. string str;
  34. cin >> str;
  35. if(str == "backspace")
  36. {
  37. if(s[l[pos]] == '(' && s[r[pos]] == ')')
  38. {
  39. remove(l[pos]);
  40. remove(r[pos]);
  41. }
  42. else{
  43. if(s[l[pos]] == 'L') continue;
  44. remove(l[pos]);
  45. }
  46. }
  47. else if(str == "delete")
  48. {
  49. //注意:这块一定要仔细读题不要落条件,不写会超时(本人的错)
  50. if(s[r[pos]] == 'R') continue;
  51. remove(r[pos]);
  52. }
  53. else if(str == "->")
  54. {
  55. if(s[r[pos]] != 'R')
  56. {
  57. //交换只改变原数组,不改变双链表
  58. //删除只改变双链表,不改变原数组
  59. int idx = r[pos];
  60. swap(s[idx],s[pos]);
  61. pos = idx; //一定要挪动一下pos的位置
  62. }
  63. }
  64. else
  65. {
  66. if(s[l[pos]]!='L')
  67. {
  68. int idx = l[pos];
  69. //这里交换原数组不会改变,双链表数组
  70. swap(s[idx],s[pos]);
  71. pos = idx;
  72. }
  73. }
  74. }
  75. //遍历链表
  76. for(int i=r[0];i!=s.size()-1; i=r[i])
  77. cout << s[i];
  78. return 0;
  79. }

双链表 一定要多动手模拟,手动去做一下删除和插入操作,自己就会深有体会

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

闽ICP备14008679号