首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.” 和”aeiou” ,则删除之后的第一个字符串变成”Thy r stdnts.” 。
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.” 和”aeiou” ,则删除之后的第一个字符串变成”Thy r stdnts.” 。
admin
2019-03-29
88
问题
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.” 和”aeiou” ,则删除之后的第一个字符串变成”Thy r stdnts.” 。
选项
答案
/////////////////////////////////////////////////////////////////////// // Delete all characters in pStrDelete from pStrSource /////////////////////////////////////////////////////////////////////// void DeleteChars(char* pStrSource, const char* pStrDelete) { if(NULL == pStrSource || NULL == pStrDelete) return; // Initialize an array, the index in this array is ASCII value. // All entries in the array, whose index is ASCII value of a // character in the pStrDelete, will be set as 1. // Otherwise, they will be set as 0. const unsigned int nTableSize = 256; int hashTable[nTableSize]; memset(hashTable, 0, sizeof(hashTable)); const char* pTemp = pStrDelete; while (’\0’ != *pTemp) { hashTable[*pTemp] = 1; ++ pTemp; } char* pSlow = pStrSource; char* pFast = pStrSource; while (’\0’ != *pFast) { // if the character is in pStrDelete, move both pStart and // pEnd forward, and copy pEnd to pStart. // Otherwise, move only pEnd forward, and the character // pointed by pEnd is deleted if(1 != hashTable[*pFast]) { *pSlow = *pFast; ++ pSlow; } ++pFast; } *pSlow = ’\0’; }
解析
这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。
要编程完成这道题要求的功能可能并不难。毕竟,这道题的基本思路就是在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。但如何能够把效率优化到让人满意的程度,却也不是一件容易的事情。也就是说,如何在第一个字符串中删除一个字符,以及如何在第二字符串中查找一个字符,都是需要一些小技巧的。
首先我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度为n 的字符串而言,删除一个字符的时间复杂度为O(n) 。而对于本题而言,有可能要删除的字符的个数是n ,因此该方法就删除而言的时间复杂度为O(n2) 。
事实上,我们并不需要在每次删除一个字符的时候都去移动后面所有的字符。我们可以设想,当一个字符需要被删除的时候,我们把它所占的位置让它后面的字符来填补,也就相当于这个字符被删除了。在具体实现中,我们可以定义两个指针(pFast 和pSlow) ,初始的时候都指向第一字符的起始位置。当pFast 指向的字符是需要删除的字符,则pFast 直接跳过,指向下一个字符。如果pFast 指向的字符是不需要删除的字符,那么把pFast 指向的字符赋值给pSlow 指向的字符,并且pFast 和pStart 同时向后移动指向下一个字符。这样,前面被pFast 跳过的字符相当于被删除了。用这种方法,整个删除在O(n) 时间内就可以完成。
接下来我们考虑如何在一个字符串中查找一个字符。当然,最简单的办法就是从头到尾扫描整个字符串。显然,这种方法需要一个循环,对于一个长度为n 的字符串,时间复杂度是O(n) 。
由于字符的总数是有限的。对于八位的char 型字符而言,总共只有28=256 个字符。我们可以新建一个大小为256 的数组,把所有元素都初始化为0 。然后对于字符串中每一个字符,把它的ASCII 码映射成索引,把数组中该索引对应的元素设为1。这个时候,要查找一个字符就变得很快了:根据这个字符的ASCII 码,在数组中对应的下标找到该元素,如果为0 ,表示字符串中没有该字符,否则字符串中包含该字符。此时,查找一个字符的时间复杂度是O(1) 。其实,这个数组就是一个hash 表。
转载请注明原文地址:https://kaotiyun.com/show/yRmZ777K
0
程序员面试
相关试题推荐
TheUnitedStatesInterstateHighwaySystemisaninfrastructurefeatofunprecedentedproportions.Notonlydoesitjoinallfi
AWelcomeE-mail欢迎邮件Someinternationalstudentsarecomingtoyouruniversity.Writethemane-mailinthenameoftheStudent
[A]TherelativelylowtuitionfeesinAsiaarealsoamaindrawforprospectivestudents.Lastyear,onlinehighereducationre
求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
游标的作用?如何知道游标已经到了最后?
请根据设计模板创建演示文稿,命名为“总结”,保存在D盘根目录下。
在实际应用中,用户通常依靠评价程序来测试系统的性能。以下评价程序中,(16)的评测准确程度最低。事务处理性能委员会(TransactionProcessingPerformanceCouncil,TPC)是制定商务应用基准程序(Benchmark)标
随机试题
常用麝香草酚酒精的浓度是
下列说法错误的是:()
对国有企业改革中涉及的划拨土地使用权,下列(),经批准可保留划拨土地使用权。
统计指标的两个主要特点是( )。
简述中华人民共和国成立的历史意义。
你是单位领导,一位朋友的孩子在你单位。朋友让你平时多照顾一下他的孩子,你怎么做?
一、注意事项 1.《申论》考试,与传统作文考试不同,是对分析材料的能力、表达能力的考试。 2.作答参考时限:阅读资料40分钟,作答110分钟。 3.仔细阅读给定的资料,按照后面提出的“申论要求”依次作答。二、资料1.据称,如果从正规
Accordingtothepassage,somepeoplestartedanationalassociationsoasto______.Bysayingthatthebombalsohasadeterre
文化强国,是指这个国家具有强大的文化力量。建设社会主义文化强国
Whatdoesthewomanplantodotomorrow?
最新回复
(
0
)