今天这道题我花了流程图, 思路清晰了很多, 对于自己哪方面不够熟悉也清楚了. 这个题可以建立一个辅助的栈, 建立一个循环, 一直判断第二个序列中的元素是否在栈顶, 如果在栈顶就弹出栈顶的元素并且寻找第二个序列中的下一个数字, 如果发现不在栈顶就一直给栈顶添加元素直到在栈顶遇见这个数字. 代码在下面, 第一次知道 for 循环还可以这么写, 这样等于嵌套了两个 for 循环, 而且循环中递增项在循环内部.
- #include<iostream>
- #include<vector>
- #include<stack>
- using namespace std;
- class Solution {
- public:
- bool IsPopOrder(vector<int> pushV, vector<int> popV) {
- stack<int> st;
- int i, j = 0;
- int len = popV.size();
- st.push(pushV[0]);
- for (i = 0, j = 0; i <len&&j < len; )
- {
- if (popV[j] == st.top() && st.empty() != true)// 判断是否在栈顶
- {
- st.pop();
- j++;
- }
- else {// 这里要注意, 因为进入循环的条件是 i<len, 所以 i 可能等于 len-1, 此时不能访问 pushV[++i], 非法
- if (i + 1 < len)
- st.push(pushV[++i]);
- else
- i++;// 如果 i+1=len, 还没有找到, 说明没有了, 给 i+1 让循环出来
- }
- }
- if (st.empty() == true)
- return true;
- else
- return false;
- }
- };
- int main()
- {
- Solution so;
- vector<int> v1 = { 1,2,3,4,5 };
- vector<int> v2 = { 4,5,3,2,1 };
- vector<int> v3 = { 4,3,5,1,2 };
- cout << so.IsPopOrder(v1, v2) << endl;
- cout << so.IsPopOrder(v1, v3) << endl;
- return 0;
- }
今天总结两点:
1, 思路清晰很重要, 画流程图
2. 一个思路进行不下去想想类似的其他表达方式, 思路要灵活
今天我参考 GitHub 上答案的时候, 发现参考了答案之后也报错, 不能一味的相信答案. 答案在中间我注释的地方没有考虑到, 因此死循环了.
最后, 我想写一点最近关于学习的感悟. 首先, 学习是自己的事, 因此你在学习的时候不要跟别人做比较. 跟别人比容易迷失自己, 只要自己清楚自己的该做什么, 以什么样的进度去做就够了, 多关注自己. 我知道这样很难, 但是我想一点一点去努力尝试做到. 其次, 学习的目的可以提高自己, 也可以是开阔眼界, 但绝对不是让别人觉得我爱学习, 别虚荣, 没有一点意义. 再说了, 你学习不学习, 除了你自己, 还有谁真的在乎呢?
来源: http://www.bubuko.com/infodetail-3090895.html