两道大众点评网技术部的笔试题

来源:互联网 发布:数据挖掘是做什么的 编辑:程序博客网 时间:2024/05/01 22:40

技术部全职-研发工程师问题测试(答题时间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小时同步数据后进行对比和更正最新数据。这样就可以解决并发量过大造成的冲突影响了,中心服务器的内存操作需要加锁,确保原子性。



以上,如有更好的答案,请指正,欢迎探讨,呵呵^_^*



原创粉丝点击