搜狗面试题 火眼金睛

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),

最后将所有的回答者添加进提问者的集合

在打印前 对每个用户进行审查,看其回答者集合中是否存在两个以上的作弊人士,如果存在,便将其设置为作弊者

 

posted on 2016-11-05 09:50  winters86  阅读(240)  评论(0编辑  收藏  举报