diff --git "a/004-\346\233\277\346\215\242\347\251\272\346\240\274/README.md" "b/004-\346\233\277\346\215\242\347\251\272\346\240\274/README.md" index 77cc7ff..5aeb954 100644 --- "a/004-\346\233\277\346\215\242\347\251\272\346\240\274/README.md" +++ "b/004-\346\233\277\346\215\242\347\251\272\346\240\274/README.md" @@ -169,7 +169,7 @@ public: int __tmain( ) { - char str[10 + 1] = "a b c d"; + char str[20 + 1] = "a b c d";//arrary size too small and later opeation will exceed boundary Solution solu; solu.replaceSpace(str, 10); @@ -179,4 +179,4 @@ int __tmain( ) return 0; } -``` \ No newline at end of file +``` diff --git "a/005-\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250/README.md" "b/005-\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250/README.md" index cdb9f77..6401cb6 100644 --- "a/005-\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250/README.md" +++ "b/005-\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250/README.md" @@ -152,6 +152,7 @@ public: int __tmain( ) { ListNode list[4]; + //create a listnode, value + node pointed to the address of next value list[0].val = 1; list[0].next = &list[1]; list[1].val = 2; diff --git "a/006-\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" "b/006-\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" index 5b5dcdb..e6ab71e 100644 --- "a/006-\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" +++ "b/006-\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" @@ -218,7 +218,7 @@ int __tmain( ) int pre[] = { 1, 2, 4, 7, 3, 5, 6, 8 }; int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 }; - vector preOrder(pre, pre + 8); + vector preOrder(pre, pre + 8); //通过数组pre的地址初始化,注意地址是从0到8(左闭右开区间) vector inOrder( in, in + 8); Solution solu; diff --git "a/007-\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/README.md" "b/007-\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/README.md" index 4b94618..bfecca1 100644 --- "a/007-\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/README.md" +++ "b/007-\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/README.md" @@ -1,72 +1,72 @@ -# +#链接 ------- ->ţOJ[ջʵֶ](http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-rankingg) +>牛客OJ:[用两个栈实现队列](http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-rankingg) > ->ŶOJhttp://ac.jobdu.com/problem.php?pid=1512 +>九度OJ:http://ac.jobdu.com/problem.php?pid=1512 > ->GitHub룺 [007-ջʵֶ](https://github.com/gatieme/CodingInterviews/tree/master/006-%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91) +>GitHub代码: [007-用两个栈实现队列](https://github.com/gatieme/CodingInterviews/tree/master/006-%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91) > ->CSDN⣺[ָOffer--007-ջʵֶ](http://blog.csdn.net/gatieme/article/details/51112580) +>CSDN题解:[剑指Offer--007-用两个栈实现队列](http://blog.csdn.net/gatieme/article/details/51112580) -| ţOJ | ŶOJ | CSDN | GitHub | +| 牛客OJ | 九度OJ | CSDN题解 | GitHub代码 | | ------------- |:-------------:| -----:| -----:| -|[ջʵֶ](http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-rankingg) | [1512-ջʵֶ](http://ac.jobdu.com/problem.php?pid=1512) | [ָOffer--007-ջʵֶ](http://blog.csdn.net/gatieme/article/details/51112580) | [006-ؽ](https://github.com/gatieme/CodingInterviews/tree/master/006-%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91) | +|[用两个栈实现队列](http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-rankingg) | [1512-用两个栈实现队列](http://ac.jobdu.com/problem.php?pid=1512) | [剑指Offer--007-用两个栈实现队列](http://blog.csdn.net/gatieme/article/details/51112580) | [006-重建二叉树](https://github.com/gatieme/CodingInterviews/tree/master/006-%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91) |
-**Ҳѡ[صĿ¼-ָOffer--⼯Ŀ¼](http://blog.csdn.net/gatieme/article/details/51916802)** +**您也可以选择[回到目录-剑指Offer--题集目录索引](http://blog.csdn.net/gatieme/article/details/51916802)** -# +#题意 ------- -Ŀ +题目描述 ->ջʵһУɶеPushPop еԪΪint͡ +>用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 -# +#分析 ------- -ʼάs1Ϊ**洢ռ**s2Ϊ**ʱ** +始终维护s1作为**存储空间**,以s2作为**临时缓冲区**。 -* ʱԪѹs1 +* 入队时,将元素压入s1。 -* ʱs1Ԫ롱ѹ룩s2s2ĶԪصΪԪأ֮ٽs2ʣµԪءs1 +* 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。 -ʾͼ +见下面示意图: -![ջģ](./stack2queue.jpg) +![用两个栈模拟队列](./stack2queue.jpg) -˼·ӹɡһϸǿŻһµġڳʱs1Ԫ롱s2ʱԭs1ջ׵Ԫأá롱s2ֻs1.Count()-1ֱӵΪԪطءԼһѹջIJԼһˣʾʶ⡣ +上述思路,可行性毋庸置疑。但有一个细节是可以优化一下的。即:在出队时,将s1的元素逐个“倒入”s2时,原在s1栈底的元素,不用“倒入”s2(即只“倒”s1.Count()-1个),可直接弹出作为出队元素返回。这样可以减少一次压栈的操作。约有一半人,经提示后能意识到此问题。 -˼·Щ֣磺 +上述思路,有些变种,如: -* ʱжs1ǷΪգ粻Ϊգ˵Ԫضs1ʱԪֱѹs1ΪգҪs2Ԫءs1ѹԪء +* 入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s2;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。 -* ʱжs2ǷΪգ粻Ϊգֱӵs2ĶԪزӣΪգs1Ԫ롱s2һԪصӡ -Щͬʱ뵽ڷͱ֣Ӧ˵ͷԻDZȽġ +* 出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。 +有些人能同时想到大众方法和变种,应该说头脑还是比较灵光的。 -ڵһֵַs2ȽϡÿγӺ󣬲Ԫءءs1´λdzӲЧʻһЩ´ӲЧʲһַʱ߷ȽϲͬܡҸоûоӡӲֲʱַʱ临ӶȺͿռ临ӶӦ޼޷Ƕٸжϣ +相对于第一种方法,变种的s2好像比较“懒”,每次出队后,并不将元素“倒回”s1,如果赶上下次还是出队操作,效率会高一些,但下次如果是入队操作,效率不如第一种方法。我有时会让面试者分析比较不同方法的性能。我感觉(没做深入研究),入队、出队操作随机分布时,上述两种方法总体上时间复杂度和空间复杂度应该相差无几(无非多个少个判断)。 -ÿεȥĻЧʲ̫ã˼µı +但是每次倒来倒去的还是效率不太好,因此我们思考出了如下的变种 -ʼάs1Ϊ**ջ**s2Ϊ**ջ** +始终维护s1作为**输入栈**,以s2作为**输出栈** -* ʱԪѹs1 +* 入队时,将元素压入s1。 -* ʱжs2ǷΪգ粻ΪգֱӵԪأΪգs1Ԫ롱s2һԪصӡ -˼·˷ջҪʱšһΡʵк˵ʱٵԵʰɡ +* 出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。 +这个思路,避免了反复“倒”栈,仅在需要时才“倒”一次。但在实际面试中很少有人说出,可能是时间较少的缘故吧。 -# +#代码 ------- ```cpp #include #include using namespace std; -// Կ +// 调试开关 #define __tmain main #ifdef __tmain @@ -91,40 +91,40 @@ public: { int node = -1; - // ջNULLʱΪ + // 两个栈都是NULL的时候,整个队列为空 if(this->empty( ) == true) { - debug <<"ΪNULL" <