2014年3月18日
摘要: 2014-03-18 05:28题目:你肯定听过汉诺威塔的故事:三个柱子和N个从小到大的盘子。既然每次你只能移动放在顶上的盘子,这不就是栈操作吗?所以,请用三个栈来模拟N级汉诺威塔的玩法。放心,N不会很大的。解法:递归着玩儿吧,还挺容易写的。要是迭代,我估计够呛。代码: 1 // 3.4 Implement Hanoi Tower with three stacks. 2 #include 3 #include 4 using namespace std; 5 6 class Solution { 7 public: 8 void initHanoiTower(i... 阅读全文
posted @ 2014-03-18 05:33 zhuli19901106 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 05:17题目:设计一个栈,这个栈实际上由一列子栈组成。每当一个子栈的大小达到n,就新产生下一个子栈。整个栈群对外看起来就像普通栈一样,支持取顶top()、压入push()、弹出pop()操作。另外再实现一个弹出特定子栈popAt()的操作。解法:用stack构成的数组,可以实现快速的随机访问。用stack构成的链表实现,可以防止在中间的一些子栈进行pop操作造成的空隙,但顺序访问的效率要低一些。得根据执行这些操作的偏好和频率来定。代码: 1 // 3.3 Implement a stack with multiple sub-stacks. If one substac 阅读全文
posted @ 2014-03-18 05:23 zhuli19901106 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 05:08题目:实现一个栈,除了能进行push和pop之外,还能在O(1)时间内返回栈中最小的元素。解法:用另一个“最小栈”存放最小的元素,每当有不小于当前最小值的元素进栈时,就代表最小值更新了(就算与当前最小值相等,也代表个数变了)。这时,同时要将最小值进栈。这个最小栈的栈顶就是最小的元素。出栈时,遇到数据栈的栈顶元素与最小栈相等时,要同时将最小栈出栈;否则只弹出数据栈即可。代码: 1 // 3.2 Design a modified stack that in addition to Push and Pop can also provide minimum elem 阅读全文
posted @ 2014-03-18 05:16 zhuli19901106 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 03:19题目:用一个数组实现3个栈。解法: 首先我想过让三个栈动态决定长度。要么左右各一个向中间靠拢,要么三个穿插着,后来都觉得实现起来太复杂,而且思路总有各种功能缺陷,会导致额外的时间或空间复杂度。所以,还是三等分成固定大小吧。好写又好用。代码:// 3.1 Use an array to implement three stacks.// three fixed-length stacks#include #include #include using namespace std;template class ThreeStack {public: Thre... 阅读全文
posted @ 2014-03-18 05:00 zhuli19901106 阅读(314) 评论(0) 推荐(0) 编辑
摘要: Reverse Words in a String2014.3.18 03:09Given an input string, reverse the string word by word.For example,Given s = "the sky is blue",return "blue is sky the".click to show clarification.Clarification:What constitutes a word?A sequence of non-space characters constitutes a word. 阅读全文
posted @ 2014-03-18 03:13 zhuli19901106 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:57题目:检查链表是否是回文的,即是否中心对称。解法:我的做法是将链表从中间对半拆成两条,然后把后半条反转,再与前半条对比。对比完了再将后半条反转了拼回去。这样不涉及额外的空间,比反转整条链表然后比较要来的好。如果你反转了整条链表又不用额外空间,接下来跟谁比去呢?代码: 1 // 2.7 To Check the given linked list is palindrome or not? 2 #include 3 #include 4 using namespace std; 5 6 struct ListNode { 7 int v... 阅读全文
posted @ 2014-03-18 03:03 zhuli19901106 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:41题目:给定一个带有环的单链表,找出环的入口节点。解法1:用hash来检测重复节点肯定是容易想而且效率也高的好办法。代码: 1 // 2.6 You have a circular Linked List: a->b->c->d->e->c. Find where the cycle starts. 2 #include 3 #include 4 using namespace std; 5 6 struct ListNode { 7 int val; 8 ListNode *next; 9 ListNode(int x): val( 阅读全文
posted @ 2014-03-18 02:55 zhuli19901106 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:32题目:给定两个由单链表表示的数字,返回它们的和。比如(9->9) + (1->2) = 0->2->1,99 + 21 = 120。解法:逐位相加,注意处理进位、长度不等。代码: 1 // 2.5 Given two numbers represented by two lists, write a function that returns sum list. The sum list is list representation of addition of two input numbers. 2 // Example First 阅读全文
posted @ 2014-03-18 02:36 zhuli19901106 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:27题目:将一个单链表按照一个值X分为两部分,小于X的部分放在大于等于X的部分之前。解法:按照值和X的大小,分链表为两条链表,然后连起来成一条。代码: 1 // 2.4 Write code to partition a linked list around a value x, such that all nodes less than x comes before all nodes greater than or equal to x. 2 #include 3 using namespace std; 4 5 struct ListNode { 6 ... 阅读全文
posted @ 2014-03-18 02:30 zhuli19901106 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:25题目:给定一个单链表中间的节点,删掉那个节点。解法:把后面节点的数据域拷到当前节点来,然后删除后面那个节点。当前节点不是尾巴,所以后面不为空。代码: 1 // 2.2 Remove a node from middle of a linked list 2 #include 3 using namespace std; 4 5 struct ListNode { 6 int val; 7 struct ListNode *next; 8 ListNode(int x): val(x), next(nullptr) {}; 9 };10... 阅读全文
posted @ 2014-03-18 02:27 zhuli19901106 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:24题目:给定一个单链表,找出倒数第K个节点。解法:让一个指针先走K步,然后俩指针一起走到尽头。当然也可以先走到尽头数出链表的长度,然后第二次少走K步。其实耗费的工夫是一样的,但貌似总有人觉得第一种方法很巧妙很优美。代码: 1 // 2.2 Remove a node from middle of a linked list 2 #include 3 using namespace std; 4 5 struct ListNode { 6 int val; 7 struct ListNode *next; 8 ListNode(int x... 阅读全文
posted @ 2014-03-18 02:25 zhuli19901106 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:16题目:给定一个未排序的单链表,去除其中的重复元素。解法1:不花额外空间,使用O(n^2)的比较方法来找出重复元素。代码: 1 // 2.1 Remove duplicates from a linked list 2 // inefficient without hashing space 3 #include 4 #include 5 using namespace std; 6 7 struct ListNode { 8 int val; 9 struct ListNode *next;10 ListNode(int x): v... 阅读全文
posted @ 2014-03-18 02:20 zhuli19901106 阅读(515) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 02:12题目:判断一个字符串是否由另一个字符串循环移位而成。解法:首先长度必须相等。然后将第一个串连拼两次,判断第二个串是否在这个连接串中。代码: 1 // 1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring (i.e. 阅读全文
posted @ 2014-03-18 02:15 zhuli19901106 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:55题目:给定一个MxN矩阵,如果某个元素为0,则将对应的整行和整列置为0。解法:单独挑出一行和一列作为标记数组。因为某元素为0就全部置为0,所以不论A[i][j]为0中的j是几,第i行总会被置为0的。再用O(1)的额外空间去标记单独挑出的那一行一列是否包含0即可。要注意最后清零的顺序和范围不要错了。代码: 1 // 1.7 Write an algorithm such that if an element in an MxN matrx is 0, its antire row and column are set to 0. 2 #include 3 ... 阅读全文
posted @ 2014-03-18 01:59 zhuli19901106 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 05:33题目:用两个栈来实现一个队列。解法:栈是反的,队列是正的,反了再反就正过来了。所以,请看代码。操作中时间复杂度有O(1)的,有O(n)的,但均摊下来时间符合O(1)。代码: 1 // 3.5 Implement a queue MyQueue using two stacks. 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 template 9 class MyQueue {10 public:11 bool empty() {12 ... 阅读全文
posted @ 2014-03-18 01:55 zhuli19901106 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:45题目:给定一个NxN的矩阵,就地旋转90度。(没有样例又不说方向的话,随便往哪儿转。)解法:如果N为奇数,除了中心点以外四等分。如果N为偶数,四等分。按照A->B->C->D->A的方式,轮换赋值,需要O(1)的额外空间保存A的值。代码: 1 // 1.6 Given an image represented by an NXN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can yo 阅读全文
posted @ 2014-03-18 01:51 zhuli19901106 阅读(375) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:40题目:对字符串进行类似游程编码的压缩,如果压缩完了长度更长,则返回不压缩的结果。比如:aabcccccaaa->a2b1c5a3,abc->abc。解法:Count and say.代码: 1 // 1.5 Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2b1c5a3. If the compressed s 阅读全文
posted @ 2014-03-18 01:44 zhuli19901106 阅读(414) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:36题目:给定一个字符串,将其中的空格‘ ’替换为‘%20’,你可以认为字符串尾部有足够空间来容纳新增字符。请不要额外开辟数组完成。解法:先从前往后统计空格个数,然后从后往前填充字符,以免其他无关字符被‘%20’覆盖掉。代码: 1 // 1.4 Write a method to replace all spaces in a string with '%20'. 2 // do it in-place and backward. 3 #include 4 #include 5 using namespace std; 6 7 class Solut 阅读全文
posted @ 2014-03-18 01:40 zhuli19901106 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:32题目:对于两个字符串,判断它们是否是Anagrams。解法:统计俩单词字母构成是否相同即可。代码: 1 // 1.3 Given two strings, write a method to decide if one is a permutation of the other. 2 // count them. 3 #include 4 #include 5 using namespace std; 6 7 class Solution { 8 public: 9 bool isPermutation(const char *s, const c... 阅读全文
posted @ 2014-03-18 01:36 zhuli19901106 阅读(459) 评论(0) 推荐(0) 编辑
摘要: 2014-03-18 01:30题目:反转一个char *型的C/C++字符串。解法:一头一尾俩iterator,向中间靠拢并且交换字符。代码: 1 // 1.2 Implement a function void reverse(char *str) in C or C++ which reverses a null-terminated string. 2 #include 3 #include 4 using namespace std; 5 6 void reverse(char *str) 7 { 8 if (nullptr == str) { 9 re... 阅读全文
posted @ 2014-03-18 01:32 zhuli19901106 阅读(544) 评论(0) 推荐(0) 编辑