一面请看这里20140925百度校园招聘一面
二面基本就是在考算法和数学了!总共四到题目:
一 写程序实现十进制转n进制,返回值类型自己定义。我就实现 了一个 string result(int m, int n)//m表示十进制数,n表示进制数。现场写的代码不完整,回来再完善了下:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string transform(int n, int m)
{
stack<char> s;
bool negative;
if(n < 0)
{
negative = true;
n = 0 - n;
}
else negative = false;
while(n != 0)
{
char tmp;
int mod = n % m;
if(mod > 9)
tmp = 'A' + mod - 10;
else tmp = '0' + mod;
s.push(tmp);
n /= m;
}
int index = 0;
int len = s.size();
if(negative)
++len;//为负数,加负号
string result('1', len);
if(negative)
result[index++] = '-';
while(!s.empty())
{
result[index++] = s.top();
s.pop();
}
return result.substr(0, len);
}
二 一个数组由a,b,c,d,e五个字符组成,设计一种算法找出一个包含这五种字符的最小区间,数组是循环的,也就是可以有这样的区间(9,2)
因为要包含五个字符,所以最小区间长度是5。所以我最开始想到的就是让区别数从5开始往上递增,对于每一个区间数比如5,遍历数组的所有区间,判断是否包含5个字符,是的话就刚好找到了最小区间。然后这复杂度算了一下是O(n^3)了,接着在面试官的指导下我优化到了O(n^2)。他说其实最优的可以O(n),不过能优化到O(n^2)已经不错了。
三 概率题
有四种颜料,给下面8个方格填色,每相邻两个不能用同一种颜色,有多少种填色方法?
想了一下,挺简单的,就是4 * 3^7。然后他加了条件,首尾也不能用同种颜色。他这样加条件后我想了很久,中间也说了我的逻辑,我觉得没挺严谨的,但就是错误。最后没能想出正确答案。
四 也是一道在网上看到过的题目,但就是之前没去看答案,也没思考过。
百度hi有个日志文件存了用户的上线时间和下线时间,格式为 userid hh:mm::ss(上线) hh:mm:ss(下线),一行一条数据。问,如何统计一天内每一秒在线的用户数量。数据量100w。
我最终是想出了复杂度 大概在100w*40左右的算法,他好像也比较满意,但说最优可以到100W加一个常数。