首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.” 和”aeiou” ,则删除之后的第一个字符串变成”Thy r stdnts.” 。
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.” 和”aeiou” ,则删除之后的第一个字符串变成”Thy r stdnts.” 。
admin
2019-03-29
65
问题
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”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://jikaoti.com/ti/lfg7FFFM
0
程序员面试
相关试题推荐
Studyingiseasierwhenone______thebigpubliclibraries.
Publicationbiasinacademicjournalsisnothingnew.Afindingofnocorrelationbetweensportingeventsandeitherviolentcri
[A]Theperson-skillsmatchapproachtoselection[B]Theimpactsofbadselectiondecisions[C]Theimportanceofstructu
Writeanessaybasedonthefollowingoutline.Youshouldwriteabout150wordsontheANSWERSHEET.1.教师用课外时间给学生补课赚钱的现象
输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树转换成双向链表4=6=8=10=12=14=16。
删除串中指定的字符
存储过程和函数的区别
利用MSN给bob@sina.com发送电子邮件内容“8号晚上到我家一起吃饭”。
Excel2000中,列标()A.可以用各种符号表示B.用数字表示C.用字母表示D.可以用中文文字表示
随机试题
________.
在钢筋的连接中,当受拉钢筋直径大于25mm,受压钢筋直径大于28mm时,不宜采用()接头。
作业文件是职业健康安全与环境管理体系文件的组成之一,其内容包括()。
在电子邮件中所包含的信息可以是文字、声音和图形图像信息。()
案例:在一堂双手前掷实心球的体育课上,周老师为了发展学生的力量和协调素质,在完成了技能动作教学后,他安排学生进行以下练习活动:①集体的徒手动作练习,将完整的动作分解为若干个学生易掌握的动作。②将学生进行分组,根据运动能力和性别
法国的汽车工业仅次于美、日、德居世界第四位,飞机制造工业仅次于美、英居世界第三位,炼铝工业居西欧首位,钢铁工业居西欧前列,葡萄酒产量居世界首位,甜菜制糖工业居西欧前列,粮食产量居西欧第二位,农产品出口值居世界第三位,时装、化妆品等奢侈品的生产闻名世界。据此
近年来,中国经济飞速发展,人民收入明显增长,生活质量随之提高。2010年,中国GDP排名首次超越日本,位列世界第二,但与此同时,在2010全球国民幸福感的排名(盖洛普,2010)中,中国却只排在155个国家中的第125位。现代经济学是构建于“财富增加将导
设f(x)在[0,+∞)上连续,满足0≤f(x)≤x,x∈[0,+∞),设a1≥0,an+1=f(an)(n=1,2,…),证明:若条件改为0≤f(x)<x,x∈(0,+∞)则上一小题中的t=0.
Pentium微处理器在保护模式下中断服务程序的段基址由( )提供。
针对VisualBasic的菜单设计操作,下面叙述中错误的是()。
最新回复
(
0
)