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

本文介绍了一个有趣的问题:如何通过一系列观察和触摸记录来确定火星人的位置,并统计无效触摸次数。通过分析记录数据,利用哈希表进行匹配验证,最终实现了对无效触摸次数的有效统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

思路:将观察者Id和观察地点作为key,以当时的动作为value,在key相同情况下依次判断当时的动作的情况。

代码
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws IOException {
    Scanner sc = new Scanner(System.in);

    Map<String, String> idMap = new HashMap<>();
    Long result = 0L;

    while(sc.hasNext()){

        String r = sc.next();

        String[] rs = r.split(",");
        String key = rs[0] + "_" + rs[1];
        String action = rs[2];
        Long ts = Long.parseLong(rs[3]);

        String value = idMap.get(key);

        if(value == null || value.equals("")){
            if(action.equals("see")){
                idMap.put(key, "see");
            }else if(action.equals("click")){
                result ++;
            }
        }else if(value.equals("see")){
            if(action.equals("click")){
                idMap.put(key, "click");
            }
        }else if(value.equals("click")){
            if(action.equals("click")){
                result ++;
            }else if(action.equals("see")){
                idMap.put(key, "see");
            }
        }

    }

    System.out.println(result);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值