2012 百度实习生面试题

本文精选了算法面试题目,包括证明题目、数组处理、链表操作等,详细解析了如何找出数组中仅出现一次的两个数的方法,以及链表反转等常见算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一面:

第一题、任意给一个数,试证明这个数的某个倍数的十进制表示是01串,比如3的倍数111是二进制表示,5的倍数10是二进制表示,等等。

第二题、证明素数有无穷多个。
    
第三题、给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来。

void getNum(int a[],int length)
{
    int s = 0;//保存异或结果
    for(int i=0;i<length;i++)
    {
        s=s^a[i];
    }
    int temp1 = s;     //临时保存异或结果
    int temp2 = s;     //临时保存异或结果
    int k=0;
    while((temp1&1) == 0)        //求异或结果中位为1的位数
    {
        temp1 = temp1>>1;
        k++;
    }
    for(int i=0;i<length;i++)
    {
        if((a[i]>>k)&1)          //将s与数组中第k位为1的数进行异或,求得其中一个数
        {
            //cout<<a[i]<<" ";
            s=s^a[i];
        }
    }
    cout<<s<<" "<<(s^temp2)<<endl;             //(s^temp2)用来求另外一个数
}

思路:假设这两个数为a,b,将数组中所有元素异或结果是x=a^b,判断x中位为1的位数(注:因为a!=b,所以x!=0,我们只需知道某一个位为1的位数k,例如0010 1100,我们可取k=2或者3,或者5),然后将x与数组中第k位为1的数进行异或,异或结果就是a,b中一个,然后用x异或,就可以求出另外一个。为什么呢?因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,我们将x与数组中第k位为1的数进行异或时,也就是将x与a外加上其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,结果是b。

第四题、把一个链表逆过来,要求空间复杂度O(1),这个算简单的。

 

二面:

1、是如何统计代码行数以及注释的行数,并写出具体的实现代码。

2、要求用最快的速度求两个数组的交集,提示数组中的元素是无序的。写出具体的实现代码。

3、写程序,将一个浮点数转化为字符串。。

 

三面:

1、给定两个排好序的数组A和B,他们中的元素个数都是n,求他们所有元素的中位数。要求:时间复杂度为O(logn),空间复杂度为O(1)。

2、对已排好序的数组A,一般来说可用二分查找可以很快找到。现有一特殊数组A[],它是循环递增的,如A[]={ 17 19 20 25 1 4 7 9},
试在这样的数组中找一元素x,看看是否存在。
请写出你的算法,必要时可写伪代码,并分析其空间、时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值