想出一道不错的面试题,有谁能做出来?

ProgramFarmer 发布于 2016/06/27 11:31
阅读 632
收藏 1

      现在已经进入大数据时代,大数据分析一个很重要的应用就是推荐系统。假设在一个系统内,规定两个用户有两个以上相同的关注或感兴趣物品,就把这两个用户视为兴趣相同的人。比如,用户a关注了物品1、2、3,用户b关注了物品2、3、4,用户a和b都关注了物品2、3,a和b算兴趣相同的人,则把用户b关注的物品4推荐给用户a。

     完成下面代码中computeRecommend方法的功能,要求尽可能高效。

public static Map<String, int[]> computeRecommend(Map<String, int[]> data) {
// todo
return null;
}

public static void main(String[] args) {
String user1 = "a";
String user2 = "b";
String user3 = "c";
Map<String, int[]> map = new HashMap<String, int[]>();
map.put(user1, new int[] { 1, 2, 3 });
map.put(user2, new int[] { 2, 3, 4, 5 });
map.put(user3, new int[] { 4, 5, 6, 7 });
Map<String, int[]> recommendMap = computeRecommend(map);
printData(recommendMap);
// expect:
// a -> (4,5)
// b -> (1,6,7)
// c -> (2,3)
}

public static void printData(Map<String, int[]> data) {
if (data == null){
System.out.println("null");
return;
}
for (Entry<String, int[]> entry : data.entrySet()) {
System.out.println(entry.getKey() + " -> " + showArr(entry.getValue()));
}
}

public static String showArr(int[] arr) {
if (arr == null)
return "null";
else {
int len = arr.length;
StringBuilder sb = new StringBuilder("(");
for (int i = 0; i < len - 1; i++)
sb.append(arr[i] + ",");
if (len > 0)
sb.append(arr[len - 1]);
sb.append(")");
return sb.toString();
}
}

加载中
0
wang_yueyang
wang_yueyang
先排序,然后取最小公共子序列,这个思路怎么样
Ambitor
Ambitor
感觉不错
0
eechen
eechen
PHP两个函数搞定,array_intersect求交集,array_diff求差集,就是简单就是快.
<?php
header('Content-Type: text/plain; charset=utf-8');
$a = array(0,1,2,3);
$b = array(2,3,4,5);
$tmp = array_intersect($a, $b);
if(count($tmp) >= 2) {
    echo '用户a和用户b都关注了物品: '.implode(',', $tmp)."\n";
    echo '推荐给用户a的物品: '.implode(',', array_diff($b,$tmp))."\n";
    echo '推荐给用户b的物品: '.implode(',', array_diff($a,$tmp))."\n";
}
//输出:
用户a和用户b都关注了物品: 2,3
推荐给用户a的物品: 4,5
推荐给用户b的物品: 0,1
返回顶部
顶部