最近面试了几家公司,有自己喜欢的公司,也有自己不喜欢的公司。从面试的情况来说,面试并不是很理想,因此特摘抄一些自己感兴趣的面试题,希望对大家有些帮助。当然我给的答案并不一定对,只是供大家参考一下而已。
1:有27个人去商店买水,此商店正在搞促销活动,三个空水瓶子可换一瓶水,总共需要买多少瓶水,才能让每个人都有一瓶水?
解:此题从表面上来看,买三瓶奖一瓶, 需要买28/4 = 7次,也就是每次买3瓶,买7次,才有可能奖7瓶,3*7 + 7(奖励) = 28,
参考答案:第一次买3瓶奖一瓶,再买两瓶,又可以奖一瓶,相当于除第一次外,其它都是买两瓶等于买三瓶,(27-3)/3 = 8次,3 + 2*8 = 19,总共需要买19瓶水,才能让每个人都有一瓶水。
2: 有一单链表,输入K,求出此单键表倒数第K项的值,要求它的时间复杂度尽量小。
解:此问题的难点是单键表的长度我们不知道,如知道它的长度,我们只要从头循环 (单键表长度-K)次就行了。
参考答案:声明两个指针p, q,两个指针相差K,从头开始循环,当前面的哪个指针到达单键表的尾部时,后面那个指针所指的就是所要求的值。
3: 有一个整型数组,里面有一百万个数,其中有一个值重复次数超过了50万次,请找出这个数,要求此算法的时间复杂度尽量小。
参考答案:声明一个map<int, int>, 用来记录每个数出现的次数,从头开始循环,依次统计每个数的出现次数,当某个数的次数超过50万次时,返回这个数。
4: 写出满足以下条件的树结构:此树结构有一个根结点,只有此根结点没有父结点。每个结点有多个子结点,每个子结点只有一个父结点,可参考操作系统的文件夹
参考答案:无
5. 编程求整数区间[a,b]和[c,d]的交集。
例如:从键盘输入1,10,5,15这四个数表示整数区间[1,10]和[5,15];正确输出结 果是整数区间:[5,10]。
解:首先确认区间的后一个数大于前一个数,比较两个区间的第一个数,找出它们的最小值,然后比较两个区间的第二个数,找出它们的最小值,这两个最小值就是它们的交集
实现:
void getInterSec(int sec1[2], int sec2[2])
{
if (sec1[1] < sec2[0] || sec1[0] > sec2[1])
{
printf("两个区间没有交集!/n");
return;
}
printf("range is %d:%d/n",sec1[0] > sec2[0] ? sec1[0]:sec2[0], sec1[1]>sec2[1]?sec2[1]:sec2[0]);
}
6.将一个字符串逆转,例如,有字符串"tlj,yxj,xd", 逆转后变成"xd,yxj,tlj"
解:首先将整个字符串倒转,然后再将每个单词倒转即可实现
实现:
void strrev1(char* str, int start, int end)
{
for(int i=0; i < (end-start+1)/2; i++)
{
char temp = str[start+i];
str[start+i] = str[end -i];
str[end -i] = temp;
}
}
void strReverse(char *str2)
{
strrev1(str2, 0, strlen(str2)-1);
int start = 0;
for(int i=0; i<strlen(str2); i++)
{
if (str2[i] == ',')
{
strrev1(str2, start, i-1);
start = i+1;
}
}
if ((start-1) < strlen(str2))
{
strrev1(str2, start, strlen(str2) -1);
}
printf("%s\n", str2);
}