技术部全职-研发工程师问题测试(答题时间45分钟)
共两道题目,为必答题
问题:
如何快速比较这两个字符串是否相等?两个字符串相等的条件如下,字符串中的每个字母出现的次数都相等。例如:abbcd和acdbb是相等的,因为a都出现1次,b都出现2次,c都出现3次,d都出现4次。请先给出解题的思路,然后用你熟悉的语言进行具体的代码实现。(可在答案中注明解题思路)
回答:
// 比较两个字符串字符计数相等 (要越快越好)
bool compare(const char* str1, const char* str2)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
if( len1 != len2 )
return false;
int len = len1;
int counts[256];
memset(counts, 0, sizeof(counts));
for(int i=0; i<len; i++)
{
counts[str1[i]]++;
counts[str2[i]]--;
}
for(int i=0; i<256; i++)
{
if(counts[i] != 0)
{
return false;
}
}
return true;
}
问题:
点评有很多用户,每个用户发表点评或者添加商户都会有一定的积分,积分可能会在使用过程中随时更新。如何在这个千万级别的用户中,找出积分最高的10个用户。(开放性题目)
回答:
通过在服务器内存中存放10个结构体{user_id, credits}
这样用户在所有消耗积分和获得积分的地方添加一个filter,在filter当中完成如下操作:
遍历10个结构体,对比自己的积分是否超过10个结构体当中的积分,如果超过,则取代之,并滚动淘汰末尾
可能请求过多导致内存频繁读取,解决方案:
使用N台镜像服务器,如每个1小时从中心服务器同步一次数据,并计算前10名的最后一名 top[9].credits * 80%作为下界阈值,如果用户的积分超过这个值,则进入一个队列当中排队,待1小时同步数据后进行对比和更正最新数据。这样就可以解决并发量过大造成的冲突影响了,中心服务器的内存操作需要加锁,确保原子性。
以上,如有更好的答案,请指正,欢迎探讨,呵呵^_^*