摘要:
1. 简述 假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点)。请将该节点从单链表中删除。 扩展题目:给定一个链表头指针,将单链表逆置。2. 思路 对于第一个问题,首先把要删除的节点内容交换到后面节点上去,然后将后面的节点删除。注意,如果当前删除的节点是最后一个节点的时候,是无法搞定的。assert(Curr!=NULL&&Curr->Link!=NULL);swap(Curr->value,Curr->Link->value);Tmp=Curr->Link;Curr->Link=Tmp-> 阅读全文
摘要:
1. 简述使用两个字符串之间的编辑距离计算它们的相似度,相似度=1/(编辑距离+1)。两个字符串的编辑距离:指通过下面三种操作可以将两个字符串变为相同的字符串需要的次数。1) 修改一个字符 2) 增加一个字符 3) 删除一个字符。 对于"abcdefg"和"abcdef"两个字符串来说,我们认为可以通过增加/减少一个"g"的方式来达到目的,将两个字符串变成相同字符串的最小步数为1,因此编辑距离为1,相似度=1/(1+1)=0.5。给定两个字符,编程实现计算它们的相似度。2. 思路 这道题我暂时没什么新的想法,基本上是沿用书上的方法。见 阅读全文
摘要:
1. 简述 电话的号码盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTB······ 1) 设计程序,尽可能从这些字母组合中,找到一个有意义的单词来表述一个电话号码。如单词"computer"来描述号码26678837。 2) 对于一个号码,是否可以用一个单词代表?怎样才是最快的方法?2. 思路 由于两个任务都需要判断一个字母组合是否是一个单词,所以必须预先存一份单词列表。 方法一:直接对号码进行深 阅读全文
摘要:
1. 简述 给定两个字符串s1和s2,要求判断s2是否能够被s1做循环移位得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD,s2=ACBD,返回false。2. 思路 将问题转化为:判断s1s1中是否包含s2子串。即对于s1=AABCD和s2=CDAA,判断AABCDAABCD中是否存在AA。 使用KMP匹配就行,对于s1s1也不用特地去开辟空间,假设s1的字符串指针为str,长度为len_str,只需len_str += len_str和str[i%len_str]即可。3. 参考资料 编程之美,3.1节,字符串移位包含的问题 阅读全文
摘要:
1. 简述 题目描述: Str1中可能包含的字符:除了'*'和'?'以外的任意字符。 Str2中可能包含的字符:任意字符。其中,'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次。给出这样两个字符串,判断Str2是否是Str1的子串,如果是输出第一个匹配到的子串,如果不是,输出"不是子串"。2. 分析对于'?'的处理,只要在匹配的时候将代码由:if(str1[i]==str2[j]) 改为 if(str1[i]==str2[j] || str2[j]=='?')即可。 阅读全文