xbd-ovo 2024-06-16 18:51 采纳率: 25%
浏览 3
已结题

哈希map ,为什么我的输出只有一个yes?

问题 C: 查找
时间限制: 1 Sec  内存限制: 128 MB
提交: 5540  解决: 1803
[状态] [提交] [命题人:外部导入]
题目描述
       给定一个集合,查找元素是否在集合中出现。
输入
每个测试用例由多行组成,第一行是两个整数n和m,两个数范围在1到100000之间。自第二行起一共有n+m个整数,其中前面n个整数代表集合的元素,随后的m个整数是待查询的数。所有的整数在范围[-2^31,2^31)内。
输出
对于每个待查询的数,如果在集合中则输出yes,否则输出no.
样例输入 Copy
5 3
7 9 3 2 -5
4 9 -5
5 3
-2 1 0 -2 1
0 -2 3
样例输出 Copy
no
yes
yes
yes
yes
no
提示
注意,需要快速的查找算法!效率不高的查找算法可能会超时!


import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class search{
    public static void main(String[] args) {
        //输入
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            // 读取 n 和 m
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            scanner.nextLine(); // 消耗掉换行符!!!!!!!!!!!!!!!!!

            // 创建 HashMap 来存储集合元素
            Map<Integer, Boolean> set = new HashMap<>();

            // 读取 n 个集合元素并添加到 HashMap 中
            for (int i = 0; i < n; i++) {
                int num = scanner.nextInt();
                set.put(num, true); // 使用 true 作为 value 只是一个标记,因为我们只关心 key
                if (i < n - 1) {
                    scanner.nextLine(); // 如果不是最后一个元素,消耗掉换行符
                }
            }

            // 读取 m 个待查询的数并检查是否在集合中
            for (int i = 0; i < m; i++) {
                int query = scanner.nextInt();
                if (set.containsKey(query)) {
                    System.out.println("yes");
                } else {
                    System.out.println("no");
                }
                if (i < m - 1) {
                    scanner.nextLine(); // 如果不是最后一个查询,消耗掉换行符
                }
            }
        }
        scanner.close();
    }
}

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-16 18:52
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,确实存在一个问题导致输出结果不正确,只输出了一个"yes"。问题出在scanner.nextLine();这行代码上,它被错误地用来“消耗掉换行符”,但实际上它会读取整个下一行,包括待查询的数字,导致之后的输入无法被正确读取。

    正确的做法是在读取整数后使用scanner.hasNextInt()来判断是否还有下一个整数,而不是通过scanner.nextLine()来跳过换行符。这是因为nextInt()方法在读取完一个整数后会自动跳过空格、制表符和换行符等空白字符,直到遇到下一个非空白字符为止。

    下面是修改后的代码,去掉了不必要的scanner.nextLine()调用,并且使用scanner.hasNextInt()来确保正确处理输入流中的所有数字:

    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    public class search{
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNextInt()) {
                int n = scanner.nextInt();
                int m = scanner.nextInt();
    
                Map<Integer, Boolean> set = new HashMap<>();
    
                for (int i = 0; i < n; i++) {
                    int num = scanner.nextInt();
                    set.put(num, true);
                }
    
                for (int i = 0; i < m; i++) {
                    int query = scanner.nextInt();
                    if (set.containsKey(query)) {
                        System.out.println("yes");
                    } else {
                        System.out.println("no");
                    }
                }
            }
            scanner.close();
        }
    }
    

    在这个版本中,我们不再尝试“消耗掉换行符”,而是依赖于nextInt()方法的默认行为,即跳过空白字符,包括换行符。这样,代码就能正确处理输入流中的所有数字,而不会因为意外地读取了额外的行而导致后续输入无法被读取。

    这个修改应该能解决你的问题,使程序能够正确输出每个待查询数字的结果,无论是"yes"还是"no"。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 创建了问题 6月16日

悬赏问题

  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥60 如何批量获取json的url
  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 pg数据库导入数据序列重复