复习笔记5

看到的几道面试题

[quote]1、5个硬币中有一个假币,质量比真币轻,利用一个天平在最少的称量次数把假币识别出来。称量2次和3次最多可以识别多少个硬币中的一个假币。(常规题)

2、单链表如何判断有环。(快慢指针遍历的方法面试官不满意)

3、有红球和蓝球各50个,还有盒子两个。现在设计放入两个盒子中红球和蓝球的个数,使得不知情的人取得红球的概率最大。

4、一个文件里存储了很多的URL,不考虑内存的限制,把相同的URL去掉。

5、一个数据,里面存储的数据是无序的,其中有一个数出现的次数超过50%,用最小时间和空间复杂度的方法把这个数求出。

6、给定一个中文品牌名,设计一个算法让计算机在互联网上把它的英文名找出来。[/quote]

1 1次最多3个硬币,2次最多3*3个硬币,3次最多3*3*3个硬币

2 网上的解答大多是两个指针,一个跳一步一个跳两步,看是否会相遇,证明过程略。不过理论上给链表元素加一标志量,遍历时修改标志量,如果遍历到标志量被修改的指针,证明重复,最多也就一次遍历,应该更快。

3 1/0 49/50

4 不考虑内存限制,hash吧,bloomfilter空间复杂度会更好

5 看到一个思路,所求数肯定是中位数,所以用线性时间复杂度的中位数算法求解

private int mergesort(int p, int r, int i) {
if (p == r) {
return array[p];
}
int q = partition(array, p, r);
int k = q - p + 1;
if (i == k) {
return array[q];
} else if (i < k) {
return mergesort(p, q - 1, i);
} else {
return mergesort(q + 1, r, i - k);
}
}

另外有牛人指出任意找到两个不相等的数删掉,最后剩下的一定也是所求数字,证明从略。这种思路更简单,不过时间效率应该会低一点。


新看到牛人O(n)算法,而且空间消耗很小,记录一下

[quote]int ret, count = 0;
for (int i = 0; i < N; ++i)
{
if (count == 0) {ret = A[i]; ++count;}
else if (A[i] == ret) ++count;
else --count;
}
return ret;[/quote]


6 不是很明白题意,如果是指翻译概率的话,针对含有该中文品牌的网页做训练,应该可以求得一个类似的答案。或者是将该中文名称丢入搜索引擎,根据搜索结果再做训练工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值