最近面试C++程序员的一些题目

最近面试了几家公司,有自己喜欢的公司,也有自己不喜欢的公司。从面试的情况来说,面试并不是很理想,因此特摘抄一些自己感兴趣的面试题,希望对大家有些帮助。当然我给的答案并不一定对,只是供大家参考一下而已。

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值