判断两个数据集是否相同

从标准输入中读入两个整数集,整数集中数据无序,且可能有重复数据。当两个数据集中数据完全相同(数据相同,数据若重复,重复个数也相同,顺序不一定相同),则两个数据集相同。编写一程序判断输入的两数据集是否相同:用1表示相同,用0表示不同。
【输入形式】
先输入第一组整数集的个数(大于等于1,小于等于20),然后输入第一组整数(以一个空格分隔);再输入第二组整数集的个数(大于等于1,小于等于20),并输入第二组整数(以一个空格分隔)。
【输出形式】
若两数据集相同,则输出1,否则输出0,然后按照从小到大的顺序分行输出第一个数据集中的数据及重复个数(以一个空格分隔数据和重复个数)。
【样例输入1】
10
100 56 7 89 -12 100 7 -12 100 56
10
-12 7 7 56 100 -12 100 56 89 100
【样例输出1】
1
-12 2
7 2
56 2
89 1
100 3
【样例输入2】
10
56 70 -12 100 7 89 -12 100 56 1001
9
1001 56 70 89 -12 100 7 -12 100
【样例输出2】
0
-12 2
7 1
56 2
70 1
89 1
100 2
1001 1
【样例说明】
样例1中输入的两个数据集的数据和各个数据的重复个数都完全相同,所以输出1,然后按从小到大的顺序输出第一个数据集中的数据及重复个数(即:有2个-12,2个7,2个56,1个89,3个100)。
样例2中输入的两个数据集中的数据相同,但第一个数据集中有2个56,而第二个数据集中有1个56,所以两个数据集不同,输出0,并按从小到大的顺序输出第一个数据集中的数据及重复个数。
【评分标准】
该题要求判断两数据集是否相同。

package compare;

import java.util.Scanner;

public class Compare {

	public static int compare(int[] a, int[] b) {
		// System.out.println(111);
		int temp;
		int flag = 1;//比较标志符
		
		if (a.length != b.length) {		//如果他俩长度都不等,肯定不一样
			System.out.println("0");
			return 0;
		} else {
			for (int i = 0; i < a.length; i++) {
				for (int j = i; j < b.length; j++) {
					if (a[i] == b[j]) {				//如果a中的某个数字和b中的某个数字相等,把b中的这个数字与b中第i个交换;
														//如a[0]=b[5],把b[0]和b[5]交换,以此往后推,以免重复数字干扰
						temp = b[j];
						b[j] = b[i];
						b[i] = temp;
						flag = 0;		//只要b中有a的某个数字,flag=0,如果b里面没有a的某个数字,flag=1
					}
				}
				if (flag == 1) {		//a中的某个数字,b里面没有,所以他俩不一样
					System.out.println("0");//0表示他俩不等,1表示他俩相等
					return 0;

				}
				flag = 1;			//如果有一样的,每次重置flag
			}

			System.out.println("1");	//如果顺利执行,说明a b里面的都能配对
			return 1;

		}

	}

	public static void repeat(int[] a) {	//我已经提前冒泡排序过了,现已经是从小到大而且重复数字相邻
		int num = 0;//a里面某个数字重复的次数

		for (int i = 0; i < a.length;) {	//看清这没有i++
			for (int j = 0; j < a.length; j++) {
				if (a[i] == a[j])		//判断a里的某个数字只要有一样的,num++
					num++;
			}
			i = i + num;			//这是重点!!!!因为系统只让输出一遍某个数字出现了几次,一遍 一遍 一遍
			System.out.println(a[i - 1] + " " + num);	//假设第一个数字重复了2次,则只输出最后出现的那个a[i](i为重复数字最后出现的下脚标),即a[1]
														//然后i=i+num,即为第一个重复数字后的下一个数字,再进行比较
			num = 0;		//每次比较完,重置num
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int size1, size2;
		int temp;
		size1 = sc.nextInt();
		int a[] = new int[size1]; // 定义一个数组a

		for (int i = 0; i < size1; i++) {
			a[i] = sc.nextInt();

		}
		size2 = sc.nextInt();
		int b[] = new int[size2]; // 定义一个数组b

		for (int i = 0; i < size2; i++) {
			b[i] = sc.nextInt();

		}

		for (int i = 0; i < a.length; i++) // 冒泡排序,从小到大
		{
			for (int j = 1; j < (a.length - i); j++) {
				if (a[j - 1] >= a[j]) {
					temp = a[j];
					a[j] = a[j - 1];
					a[j - 1] = temp;

				}
			}
		}

		compare(a, b);	//比较两个数组是否相等(重复数字的个数也一样)
		repeat(a);//输出a数组中每个数字出现的个数
		sc.close();//关输入流,要不然不能运行
	}

}

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值