摘要: Q:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。A:对于这个题目,办法就是遍历第一个字符串,每次遍历时查找该字符是否在第二个字符串中,如果在,则要删除该字符。所以该问题就分为两步,查找和删除。按照最笨的做法,查找使用线性查找,即对于每一个字符,遍历第二个字符串,看是否出现。这样时间复杂度太高,如果第一个字符串长度为m,第二个字符串长度为n,则时间复杂度为O(mn)。再看删除,最笨的方法是,对于每一个要删除的字符,将其后的每一个字符都向前挪一位,这样时间 阅读全文
posted @ 2012-06-18 14:30 Cavia 阅读(458) 评论(0) 推荐(0) 编辑
摘要: Q:如何判断一个单链表是否有环,如果有环,找出环的入口点?A:首先我们判断链表是否有环,设置两个指针slow和fast,指向单链表的头部,每个循环slow走一步,fast走两步。如果没有环,fast或者fast的next会走到NULL,否则fast在环里循环最终会和slow相遇,此时即存在环。再看第二个问题,当slow和fast相遇时,假设fast已经在环内循环n圈,环长为r,同时fast走的长度为slow走的长度的两倍,设slow走了s步,则有2*s=s+n*r => s=n*r,再设单链表头部到环入口的距离为a,环入口到相遇点得距离为x,则a+x=s=n*r,因此从单链表头部到相遇点 阅读全文
posted @ 2012-06-18 13:44 Cavia 阅读(383) 评论(0) 推荐(0) 编辑
摘要: Q:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。A:将数组的每一个元素进行异或,得到的两个不同数字之间的异或,因为这两个数字不同,所以异或值必然不为0,所以我们找出异或值的一个为1的数位,按照该数位是否为0将数组分成两个子数组A和B,可以知道数组A含有的元素中有两个不同数字的一个,其他都是两两相同的数字;数组B含有的元素中有两个不同数字的另外一个,其他也都是两两相同的数字,再分别进行异或,即可求得两个数。 1 #include <iostream> 2 using namespace s 阅读全文
posted @ 2012-06-18 10:14 Cavia 阅读(3461) 评论(0) 推荐(0) 编辑