算法11 抓住波粒二象性的火星人

2017-10-29  本文已影响0人  holmes000

题目:小伙伴们发现, 火星人都有神奇的波粒二象性:

单单凭眼睛, 不能准确地判定他们的位置, 还需要用手触摸一下,才能固定他们的位置
单单用手触摸,也不能锁定他们的位置, 还必须 先 看到
火星人的波粒二象性很奇怪, 每一次触摸至少要对应一次预先的看到, 即看到一次, 触摸两次, 第二次的就会失效, 但是先看到 3 次, 再触摸 3 次, 则是有效的
同一个人,在同一个地点的观察和触摸才可以匹配
所以 同学们收集了过去一天内所有的观察和触摸到火星人的记录, 希望发现前一天中 无效的触摸 有多少次.
记录格式为: 用逗号格开的 4 元组. 4 部分的信息分别为: 观察者ID, 观察地点, 当时的动作, 动作发生的时间戳(精确到秒)
例如
1710170708481678574,1895915,click,1508195328
1607272005511968269,1191643,see,1507998070
要求输出的结果为: 一个整数

思路:

public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String msg;
    Map<String, ArrayList<Pos>> watcher = new HashMap<>();
    while ((msg = br.readLine()) != null && !"".equals(msg)) {
        String[] x = msg.split(",", 4);
        String key = x[0] + ":)" + x[1];
        System.out.println("click".equals(x[2]));
        Pos p = new Pos(Long.parseLong(x[3]), "click".equals(x[2]) ? -1: 1);
        if(!watcher.containsKey(key))
            watcher.put(key, new ArrayList<Pos>());
        watcher.get(key).add(p);
    }

    long[] result = {0l};
    watcher.forEach((k, list) -> {
        long[] checker = {0l};
        list.forEach(pos -> {
            if(pos.weight == -1) {
                if(checker[0] == 0) {
                    result[0] += 1;
                    System.out.println("r+1");
                } else {
                    checker[0] -= 1;
                    System.out.println("c-1");
                }
            } else if(pos.weight == 1) {
                checker[0] += 1;
                System.out.println("c+1");
            }
        });
    });
    System.out.println(result[0]);
}

static class Pos {
    public long timeStamp;
    public long weight;

    public Pos(Long timeStamp, long weight) {
        this.timeStamp = timeStamp;
        this.weight = weight;
    }
}
上一篇下一篇

猜你喜欢

热点阅读