摘要:
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。主要是参考了一下两篇文章:http://blog.csdn.net/qitian0008/article/details/8042558http://www.cnblogs.com/eric-blog/archive/2012/05/03/2481510.html其中常规的方法,就是用一个i从左到右进行遍历,当i指向某个值的时候,以i为中心,逐个比较左右两个的字符是否相等。这样就可以找到一个回文,以及他的长度。但是,这样做的时候,是有重复计算 阅读全文
摘要:
1、如何判断一个链表是不是有环? 2、如果链表为存在环,如果找到环的入口点?这个算是一个比较老的题目了,之前就看到过,一般通用的做法就是弄两个指针,一个走得快一点,一个走得慢一点。一般是弄一个走一步,一个走两步。这样如果他们相遇,则说明有环。那么在有环的基础上,怎么找到这个环的入口呢,一般网上也会给出解释,可能是我的理解力比较底,网上的解释中,总是用移动了s步,又是长度的,总是弄的我很晕,于是,给出我自己的解释好了,所有的都用移动了多少步来说明。走一步的指针叫slow,走两步的叫fast。相遇的时候,slow共移动了s步,fast共移动了2s步,这个是显而易见的。定义a如下: 链表头移动a步. 阅读全文
摘要:
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:struct ComplexNode{ int value; ComplexNode* pNext; ComplexNode* pSibling;}; 请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。 思路: 一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个sibling的指针,也就是说在建立完简单链表之后,如何在新的... 阅读全文
摘要:
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。个人并不觉得这道题设计的有多么好,纯粹就属于没事卖弄技巧的那种,蛋疼的用递归来颠倒一个栈,又浪费时间又浪费空间。解法的思想其实很简单,那么就是你要我颠倒栈,那么我就先把第一个元素保存了,然后弹出其余所有的元素,然后把第一个元素压进去,然后按原来的顺序,压入被弹出的元素,得到的就是 2 3 4 5 1, 2在栈顶,接着用对于前四个,用同样的方法,最后终于颠倒了。void reverseStack(stack<T>& s){ int count 阅读全文
摘要:
题目的意思很简单,比如说有数组[1,6,9,2,1,5,15,20],那么满足上述条件的元素为1,15,20。暴力的方法就是从左到右进行遍历,到达某个数字后,在从0开始遍历到当前下标,找出最大的,再从当前下标遍历到尾,找出最小的,然后根据题意比较一下,这个算法为O(n^2)。比较简单的算法就是利用一下额外的空间,保存一下,每个元素右侧的最小值,或者左侧的最大值,在反向遍历一次。举个例子。就如[1,6,9,2,1,5,15,20],如果我们要找到该数组右侧的最小值,则从后向前遍历,20开始,20的右侧的最小值为20,之后15,15右侧的最小值为15,之后5,最小值为5,之后1,最小值为1,那么新 阅读全文