笔试算法&面试算法
文章平均质量分 56
lavor_zl
这个作者很懒,什么都没留下…
展开
-
删除单链表中重复的值
题目:删除带头结点的单链表中重复值的元素(即让每种值的元素只有一个)解题思路:用一个动态辅助存储数组,每次要向辅助数组中放入元素时,让辅助数组的长度加1,最长时与单链表一样长,设一个指针p,让它指向头结点,从单链表中第一个元素开始,将它的值放入辅助数组中,然后依次访问单链表后面的元素,用该元素的值与数组中所有已经被赋值的元素的值进行比较,如果不等于数组中任何元素的值,那么让p的ne原创 2015-01-13 10:54:22 · 2171 阅读 · 0 评论 -
单链表是否相交
题目:有两个带头结点的单链表L1,L2,判断它们是否相交(它们中是否有相同的结点)解题思路:L1,L2中任何一个链表为空它们不相交因为单链表中可能有环,所以分3种情况讨论1、L1,L2中都没有环,那么可以通过判断它们中最后一个结点是否相同,来判断它们是否相交2、L1,L2中一个有环,一个没有环,那么它们一定不相交3、L1,L2中都有环,那么只有当它们的环相同时,它们才相原创 2015-01-12 16:39:58 · 887 阅读 · 0 评论 -
输出单链表中倒数第k个结点
题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。解题思路:如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,求出它的结点的总个数n(包括头结点),所以单链表的结点是从倒数第n-1个到倒数第0个,然后再遍历一次单链表,遍历时访问的第n-k-1个结点就是该单链表中倒数第k个结点。现在要求只能遍历一次单链原创 2015-01-15 10:10:54 · 2041 阅读 · 0 评论 -
删除单链表某个结点
题目:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1)。解题思路:如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值。ADT定义如下#define ElemType int原创 2015-01-13 16:31:45 · 2556 阅读 · 1 评论 -
单链表就地逆置
题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1)。所谓“就地”指辅助存储空间为O(1)。解题思路:如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第原创 2015-01-08 18:14:47 · 13716 阅读 · 3 评论 -
在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”I am lavor_zl.”和”I love you.”,则删除之后的第一个字符串变成”amar_z"。要求相对于第一个字符串的长度n时间复杂度为O(n)。解题思路:用一个bool数组保存是否在第二个字符串中出现的所有字符,数组下标表示字符,这个数组的长度为256,因为C/C++中字符总共有256个。遍历第原创 2015-01-15 20:13:21 · 1893 阅读 · 0 评论 -
左旋转字符串
题目:左旋转字符串,定义字符串的左旋转操作:把前面若干个字符移动到尾部。比如把"lavor_zl"左旋转3位得"or_zllav"。要求时间对长度为n的字符串操作复杂度为O(n),辅助内存为O(1)。解题思路:定义一个整型参数count,用它表示旋转的位数,当左旋转的位数大于等于字符串长度时,可以用它除以字符串长度求余来表示旋转的位数,因为左旋转字符串长度的整数倍,字符串保持不变。原创 2015-01-14 21:31:52 · 943 阅读 · 0 评论 -
单链表是否有环
题目:判断一个带头结点的单链表L是否有环解题思路:咋看之下,这题还真不好解,于是又一些投机取巧的人,在访问单链表中元素的时候,用一个比较大的数N控制访问元素的个数,他们认为如果在访问到第N个元素之前有一个元素为null,那么单链表没有环,反之,单链表有环。他们的解释是都访问了这么多元素了,还没有一个元素为空,单链表很有可能有环,再加上一般单链表中的元素都不超过N个,所以单链表有环。对于原创 2015-01-11 17:14:18 · 1196 阅读 · 0 评论 -
字符串中第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。比如"lavor_zl"第一个只出现一次的字符是'a'。解题思路:C/C++字符使用Ascii编码,一个字符占一个字节即可以表示2的8次方个数,那么C/C++字符可以表示的256个字符,因此可以用一个256的数组来保存各个字符出现的次数,当然256个字符的Ascii值是0-255之间的所有数,而且'\0'的Ascii值0,所以可以用数原创 2015-01-15 18:17:34 · 1001 阅读 · 0 评论 -
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。比如输入"I love you.",输出"you. love I"。解题思路:我们可以先翻转整个字符串,然后再翻转字符串中的每个单词。比如"I love you."翻转整个字符串后得到".uoy evol I",再翻转字符串中的每一个单词得到"you.原创 2015-01-15 15:54:23 · 1047 阅读 · 0 评论 -
字符串转换成整型
题目:将字符串转换成整型,比如输入“123”,输出123。 解题思路:利用每一个0-9数字字符对应的Ascii减去48就得到了一个0-9的整型数字。用前i-1位表示的整型数字乘以10加上第i位表示的数字,就可以得到转换成的整型了。注意字符串第1个字符也可以是+或-。当字符串第1个字符是-时,用前i-1位表示的整型数字乘以10减去第i位表示的数字,就可以得到转换成的整型了。这样的话,原创 2015-01-14 09:47:44 · 3609 阅读 · 0 评论 -
字符串翻转
题目:将字符串翻转,比如输入"lavor_zl",输出“lz_roval”。解题思路:类似于顺序表的逆置,假设字符串长度为n,那么交换第1个与第n个字符,然后交换第2个和第n-1个字符,类似的交换其他的字符,一共交换n/2次算法实现:void reverseStr(char str[]){ if(str==NULL) return; int n=0;//用n原创 2015-01-14 09:33:04 · 1270 阅读 · 0 评论 -
回文字符串
题目:判断一个字符串是不是回文字符串,所谓回文字符串,就是指字符串的第i个字符与字符串的第n+1-i个字符相等,i小于等n/2。比如"abcba","abba"都是回文字符串。解题思路:比较字符串第i个字符与字符串的第n+1-i个字符相等,i小于等n/2,如果不相等就返回false,如果循环执行完了还没有返回的话就返回true。算法实现:bool isPalin原创 2015-01-15 10:50:44 · 1005 阅读 · 0 评论