随笔分类 -  剑指offer

摘要:1 #include<stdio.h> 2 #include<stack> 3 using namespace std; 4 void QSort(int*p, int left,int right) 5 { 6 if(left>=right) 7 return; 8 int i,j; 9 int 阅读全文
posted @ 2016-04-16 16:49 vaevaevae 阅读(222) 评论(0) 推荐(0)
摘要:蘑菇街校招题:给定一个字符串,问是否能通过添加一个字母将其变为回文串。 腾讯实习招聘题:对于一个字符串,删去其中某些字符,找到最长回文串。 这两题本质上都是找字符串的最长回文子序列,把当前字符串翻转,然后求翻转字符串和原来字符串的LCS。动归很容易解决。 1 #include<iostream> 2 阅读全文
posted @ 2016-04-06 14:28 vaevaevae 阅读(200) 评论(0) 推荐(0)
摘要:利用最小堆思想。首先把1压入堆,然后取出堆顶元素,分别乘以2,3,5后把新增的数压入堆。然后再取堆顶元素操作。取第1000个丑数就是取第1000个不同的堆顶元素。 其实如果用set容器来做的话效率可能会提升,因为set不会把重复元素放进自身。set找最小的元素需要O(logN)的时间,表面上比堆的O 阅读全文
posted @ 2016-03-29 23:02 vaevaevae 阅读(198) 评论(0) 推荐(0)
摘要:这道题目首先不管random指针,按照next指针把链表元素给复制出来。然后处理random指针,比较容易想到的想法是利用哈希思想(或者等价的map,set等stl容器),但这样的话需要辅助空间。 不需要辅助空间的方法,复制元素的时候把原始链表改成这样就可以了: 然后修改新增元素的random指针, 阅读全文
posted @ 2016-03-29 22:52 vaevaevae 阅读(155) 评论(0) 推荐(0)
摘要:需要O(1)时间求出最小值。如果换成最大值,那就和“滑动窗口的最大值”一题思路差不多了。 用一个栈保存元素,用另一个栈来存储最小值,如果新增的元素比栈顶元素小则压入,否则不压入。 如果检测到第一个栈把最小元素弹出了,那么另一个栈也弹出栈顶元素。 “滑动窗口的最大值”更加复杂一点,而且是用deque保 阅读全文
posted @ 2016-03-29 22:35 vaevaevae 阅读(154) 评论(0) 推荐(0)
摘要:调整后奇数相对位置不变,偶数相对位置不变。可以先找到第一个偶数所在位置和最后一个奇数所在位置,然后把偶数一次次向后移动,空出来的第一个位置用来填充最近的一个奇数,直到把最后一个奇数填充到空出来的位置为止。 1 class Solution { 2 public: 3 void reOrderArra 阅读全文
posted @ 2016-03-29 22:21 vaevaevae 阅读(177) 评论(0) 推荐(0)
摘要:具体分析可见http://blog.csdn.net/libin1105/article/details/48267113 需要指出的是,上述博客中2*(a+b)=a+b+c+b应该改为2*(a+b)=a+b+(c+b)*n,其中n为自然数。 然后得到关系式a=(b+c)*n-b 由此可见两个指针会 阅读全文
posted @ 2016-03-28 16:27 vaevaevae 阅读(138) 评论(0) 推荐(0)
摘要:1 class Solution { 2 public: 3 int LastRemaining_Solution(unsigned int n, unsigned int m) 4 { 5 if(n<1||m<1) 6 return -1; 7 int last=0; 8 for(int i=2; 阅读全文
posted @ 2016-03-27 21:30 vaevaevae 阅读(145) 评论(0) 推荐(0)
摘要:先整体翻转一次,再一个个进行翻转,需要注意的是代码里一些字符串的操作,值得记住。 1 class Solution { 2 public: 3 string ReverseSentence(string str) { 4 if (str.empty()) return str; 5 reverse( 阅读全文
posted @ 2016-03-27 14:59 vaevaevae 阅读(157) 评论(0) 推荐(0)
摘要:又是一道字符串题,一下子难有思路,所以往动态规划方向思考。 找到动归思路不难,主要是要考虑各种情况。首先将pattern进行处理,记下不含"*"的字符串npattern,同时用一个vector记录新字符串里有哪几个字符是可以任意个数的(这里我本来以为像b*b*这样的要简化为b,后来发现简化为bb就可 阅读全文
posted @ 2016-03-27 00:16 vaevaevae 阅读(223) 评论(0) 推荐(0)
摘要:先判断有没有字符e或者E存在,如果有,则把字符分为两个字符串,分别判断这两个字符串是否能形成一个数字(注意e或E后不能有小数点,这个可以提前判断排除)。如果没有,那就直接判断这个字符串是否能形成一个数字。 1 class Solution { 2 public: 3 bool judge(char* 阅读全文
posted @ 2016-03-26 23:07 vaevaevae 阅读(269) 评论(0) 推荐(0)