搜狗面试题 火眼金睛
http://www.nowcoder.com/question/next?pid=818883&qid=26164&tid=5909447
题目的位置
3 1 1 2 2 1 1 3 2 1 2 4 1 1
这里是测试数据
package com.nowcoder.sougou; import org.junit.Test; import java.io.*; import java.util.*; /** * Created by Administrator on 2016/11/5 0005. */ public class FindCheater { class User{ private int id; private Set<User> answers; private boolean isCheater; public User(int id,boolean isCheater){ this.answers = new HashSet<User>(); this.id = id; this.isCheater =isCheater; } public int getId() { return id; } public void setId(int id) { this.id = id; } public boolean isCheater() { return isCheater; } public void setCheater(boolean cheater) { isCheater = cheater; } public Set<User> getAnswers() { return answers; } public void setAnswers(Set<User> answers) { this.answers = answers; } @Override public boolean equals(Object o){ if (o instanceof User) { if ( this.id == ((User) o).getId()){ return true; } } return false; } @Override public String toString() { String answersId=""; for(User user: answers){ answersId += user.getId()+" "; } return "User{" + "id=" + id + ", answers= " + answersId + ", isCheater=" + isCheater + '}'; } } private HashMap<Integer,User> total = new HashMap<Integer, User>() ; public void addAnswer(User asker, String[] strs){ for(int i = 2; i < strs.length ; i++){ int tempAnswerId = Integer.valueOf(strs[i]); User tempAnswer; if (!total.containsKey(tempAnswerId)){ tempAnswer = new User(tempAnswerId,false); total.put(tempAnswerId,tempAnswer); asker.getAnswers().add(tempAnswer); }else{ tempAnswer = total.get(tempAnswerId); if (tempAnswer.getAnswers().contains(asker)) { tempAnswer.setCheater(true); asker.setCheater(true); } asker.getAnswers().add(tempAnswer); } } } public void haveTwoCheaterAnswer (User user){ int i = 0; for (User tmp : user.getAnswers()){ if (tmp.isCheater()){ i++; } } if (i >= 2){ user.setCheater(true); } } @Test public void Start(){ File file = new File("E:\\test.txt"); try { BufferedReader is = new BufferedReader(new FileReader(file)); String tmpLine; while((tmpLine = is.readLine())!=null){ String[] strs = tmpLine.split(" "); for (String s : strs) System.out.print(s+" "); System.out.println(); User asker; if (strs.length > 1){ int tempAskerId = Integer.valueOf(strs[0]) ; if (!total.containsKey(tempAskerId)){ asker = new User(tempAskerId,false); total.put(tempAskerId,asker); addAnswer(asker,strs); }else{ asker = total.get(tempAskerId); addAnswer(asker,strs); } } } for(Map.Entry<Integer,User> entry :total.entrySet()){ haveTwoCheaterAnswer(entry.getValue()); System.out.println(entry.getKey()+" "+entry.getValue()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
代码比较繁琐,实现跟工具方法都写到一堆去了,主要是心情浮躁,本来这种题就是几分钟能解决的,
思路是 建立一个用户类,每个用户持有一个回答者的set集合,
然后建立一个总的用户库 hashmap
对每一行,
首先查找提问者用户是否已经被创建,如果没有 则创建这个用户,然后再遍历其 所有回答者(回答者不存在 则进行创建,回答者存在 则遍历回答者用户的回答者集合 看是否存在当前行的提问者,存在 则设置双方为cheater),
最后将所有的回答者添加进提问者的集合
在打印前 对每个用户进行审查,看其回答者集合中是否存在两个以上的作弊人士,如果存在,便将其设置为作弊者