当前位置: 首页 > news >正文

【数据结构】二维数组中的元素查重

任务描述

设二维数组a[1..m, 1..n] 含有m*n 个整数。写一个算法判断a中所有元素是否互不相同。

编程要求

输入

多组数据,每组数据有m+1行,第一行为二维数组的行数m和列数n,之后m行为输入的二维数组。当n=0且m=0时输入结束。

输出

对于每组数据分别输出一行,若二维数组中存在相等元素则输出“YES”,否则输出“NO”。

输入样例:

在这里给出一组输入。例如:

4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 4
1 2 3 4
5 6 7 8
1 9 10 11
0 0

输出样例:

在这里给出相应的输出。例如:

NO
YES

解题步骤如下:

步骤 1:初始化与循环读取输入

  • 程序启动后,进入main函数,定义整数m(行数)和n(列数),用于存储二维数组的规模。
  • 通过while (cin >> m >> n)循环持续读取多组数据,每次读取一组mn,作为当前二维数组的行数和列数。

步骤 2:判断输入结束条件

  • 在循环内部,首先检查if (m == 0 && n == 0):若mn均为 0,说明输入结束,执行break跳出循环,程序终止。

步骤 3:初始化重复检测工具

  • 对于非结束条件的mn,定义set<int> elements(集合容器),用于存储已读取的数组元素(利用集合 “元素唯一” 的特性实现去重和重复检测)。
  • 定义bool hasDuplicate = false,作为标记变量:true表示存在重复元素,false表示暂时无重复。

步骤 4:读取二维数组元素并检测重复

  • 通过两层嵌套循环读取二维数组的所有元素:
    • 外层循环(i从 0 到m-1):控制行数,依次读取每一行元素。
    • 内层循环(j从 0 到n-1):控制列数,依次读取当前行的每个元素。
  • 对于每个读取的元素num
    • hasDuplicate已为true(已发现重复),则跳过后续检测,仅继续读取元素(避免因未读完数据导致后续输入错位)。
    • hasDuplicatefalse(未发现重复),则检查num是否已在elements中:
      • elements.find(num) != elements.end()(元素已存在),则将hasDuplicate设为true(标记发现重复)。
      • 若元素不存在,则将num插入elements集合中,继续检测下一个元素。

步骤 5:输出检测结果

  • 当当前二维数组的所有元素读取完毕后,根据hasDuplicate的值输出结果:
    • hasDuplicatetrue(存在重复元素),输出YES
    • hasDuplicatefalse(所有元素互不相同),输出NO

步骤 6:重复执行

  • 完成一组数据的检测后,循环回到步骤 1,继续读取下一组mn,重复上述流程,直到输入0 0结束程序。

C++代码:

#include <iostream>
#include <set>
using namespace std;int main() {int m, n;// 循环读取多组数据,直到m和n都为0while (cin >> m >> n) {if (m == 0 && n == 0) {break;}set<int> elements;  // 用于存储已出现的元素,自动去重bool hasDuplicate = false;  // 标记是否存在重复元素// 读取二维数组元素for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {int num;cin >> num;// 若已发现重复,只需继续读取数据但不检查if (hasDuplicate) {continue;}// 检查当前元素是否已存在if (elements.find(num) != elements.end()) {hasDuplicate = true;} else {elements.insert(num);}}}// 根据是否有重复元素输出结果if (hasDuplicate) {cout << "YES" << endl;} else {cout << "NO" << endl;}}return 0;
}

Python代码:

while True:# 读取行列数m, n = map(int, input().split())# 检测结束条件if m == 0 and n == 0:break# 用于存储已出现的元素elements = set()# 标记是否存在重复元素has_duplicate = False# 读取m行数据for _ in range(m):# 读取当前行的所有元素row = list(map(int, input().split()))# 检查每行的每个元素for num in row:# 若已发现重复,仅继续读取数据if has_duplicate:continue# 检查元素是否已存在if num in elements:has_duplicate = Trueelse:elements.add(num)# 输出结果print("YES" if has_duplicate else "NO")

Java代码:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true) {// 读取行列数int m = scanner.nextInt();int n = scanner.nextInt();// 检测结束条件if (m == 0 && n == 0) {break;}// 消耗掉整数后的换行符,避免影响后续行读取scanner.nextLine();// 用于存储已出现的元素Set<Integer> elements = new HashSet<>();// 标记是否存在重复元素boolean hasDuplicate = false;// 读取m行数据for (int i = 0; i < m; i++) {// 读取当前行,分割为字符串数组String[] rowStr = scanner.nextLine().trim().split(" +");// 转换为整数并检查for (String s : rowStr) {int num = Integer.parseInt(s);// 若已发现重复,仅继续读取数据if (hasDuplicate) {continue;}// 检查元素是否已存在if (elements.contains(num)) {hasDuplicate = true;} else {elements.add(num);}}}// 输出结果System.out.println(hasDuplicate ? "YES" : "NO");}scanner.close();}
}

总结

本文描述了一个判断二维数组元素是否互不相同的算法实现。程序读取多组数据,每组包含m行n列的二维数组,使用集合(set)存储元素以检测重复。当发现重复元素时输出"YES",否则输出"NO",直到输入0 0时结束。

关键步骤:

  1. 循环读取m和n,检测结束条件
  2. 使用集合存储元素并检测重复
  3. 根据检测结果输出相应提示

该算法通过集合自动去重的特性高效实现了元素唯一性检查,时间复杂度为O(mn),适用于各种规模的二维数组。

http://www.dtcms.com/a/564721.html

相关文章:

  • 软件设计模式(tyutJAVA 状态模式实验)
  • 【LeetCode】最大连续1的个数 III
  • Java 中 组合 (Composition)、接口 (Interface) 和 委托 (Delegation) 这三个概念的区别
  • 日本IT面试:与国内有何不同?一篇解析分享
  • 13-MySQL用户管理
  • 泰安放心的企业建站公司母婴网站源码 带采集
  • 做手机旅游网站徐州市制作网站的公司
  • 关于数控滑台
  • 数学中“必要条件”和“充分条件”大白话理解
  • 实验十一 三维观察实验
  • 【AI编码】VS Code - continue - github copolit
  • UVa 12298 Super Poker II
  • SQL视图:虚拟表的完整指南
  • 经纪柜台系统---拥有1.4.9号香港牌照的优选
  • 遵义网站建设天津做网站好的公司有哪些
  • 网站建设 响应式手机app制作网站
  • Elasticsearch 的 Routing 策略详解
  • GIT命令常用方法
  • Python计算题类相关实战
  • 常用es sql
  • 网站系统管理员烟台专业网站推广
  • 理论及算法_时间抽取论文
  • React中useContext的基本使用和原理解析
  • 重庆网站建设公司是什么意思可信赖的做网站
  • 【js逆向案例四】小红书
  • Next.js路由系统
  • 6、webgl 基本概念 + 四边形纹理
  • 【weblogic】XML反序列化漏洞
  • 20-控制流多次异步
  • Python Seaborn详解:让数据可视化更简单、更美观的利器