PTA 练习7-4 找出不是两个数组共有的元素(20 分)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

PTA 练习7-4 找出不是两个数组共有的元素(20 分)


题目:

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1
#include<stdio.h>
#include<stdlib.h>
int main(void){
	int m, n, i, j, count=0, c[20];
	//输入,分别根据输入的元素个数m,n来动态创建两个存放输入元素的数组a,b,并把元素放入其中
	scanf("%d", &m);
	int *a=(int *)malloc(sizeof(int)*m);	
	for (i=0;i<m;i++){
		scanf("%d", &a[i]);
	}
	scanf("%d", &n);
	int *b=(int *)malloc(sizeof(int)*n);
	for (j=0;j<n;j++){
		scanf("%d", &b[j]);
	}
	//结束输入 
	//找出a不在b数组中的元素
	int flag=0;
	for (i=0;i<m;i++){
		for (j=0;j<n;j++){
			if (a[i]==b[j]){
				flag++;
				break;
			}				
		}
		if (flag==0){
			c[count]=a[i];
			count++;
		}			
			
		else
			flag = 0;
	} 
	//找出b不在a数组中的元素 
	flag = 0;
	for (j=0;j<n;j++){
		for (i=0;i<m;i++){
			if (b[j]==a[i]){
				flag++;
				break;
			}				
		}
		if (flag==0){
			c[count]=b[j];
			count++;
		}else
			flag = 0;
	} 
	//不重复地输出两个数组中不同的数
	printf("%d", c[0]); //为了保证末尾没有多余的空格,我们可以先输出第一个元素,如何后面都以空格+值进行输出
	for (i=1;i<count;i++){
		for (j=0;j<i;j++){
			if (c[j]==c[i])
				break;
		}
		if (j==i)
			printf(" %d", c[i]);
	} 
	return 0;
}

测试结果

在这里插入图片描述

### PTA习题7-1PTA(Programming Teaching Assistant)是一个用于编程教学和练习的在线平台,其中包含了大量针对不同难度级别的算法设计题目。对于习题 **7-1 存在的和消失的**[^1] ,其核心考察的是数组操作以及数据结构中的查找技术。 #### 题目概述 该题目通常会提供两个整数序列 A 和 B,别表示存在的元素集合与可能消失的元素集合。目标是从这两个集合出发找出仅存在于其中一个集合而不在另一个集合中的元素。这类问题可以通过多种方法解决,包括但不限于哈希表、位运算或者排序后的双指针法。 #### 方法一:基于哈希表的方法 利用 Python 的字典或其他语言中的哈希映射可以高效实现这一功能。以下是具体代码示例: ```python def find_disappeared_and_existed(nums_a, nums_b): set_a = set(nums_a) set_b = set(nums_b) disappeared = list(set_a - set_b) # 找到只存在于 A 中的元素 existed = list(set_b - set_a) # 找到只存在于 B 中的元素 return disappeared, existed # 测试用例 nums_a = [1, 2, 3, 4, 5] nums_b = [3, 4, 5, 6, 7] disappeared, existed = find_disappeared_and_existed(nums_a, nums_b) print(f"Disappeared elements: {disappeared}") print(f"Existed elements: {existed}") ``` 上述代码通过 `set` 数据结构快速计算差集来找到差异部 。这种方法的时间复杂度主要由构建集合的操作决定,通常是 O(n),因此效率较高。 #### 方法二:基于排序的双指针法 如果输入的数据量较大且不允许额外空间开销,则可以选择先对两组数据进行排序再采用双指针扫描的方式完成比较。此方式虽然牺牲了一定的空间性能但减少了内存占用,在某些特定场景下更为适用。 ```python def find_diff_sorted(a_list, b_list): a_list.sort() b_list.sort() i, j = 0, 0 result_a_not_in_b = [] result_b_not_in_a = [] while i < len(a_list) and j < len(b_list): if a_list[i] < b_list[j]: result_a_not_in_b.append(a_list[i]) i += 1 elif a_list[i] > b_list[j]: result_b_not_in_a.append(b_list[j]) j += 1 else: i += 1 j += 1 # 添加剩余未匹配项 result_a_not_in_b.extend(a_list[i:]) result_b_not_in_a.extend(b_list[j:]) return result_a_not_in_b, result_b_not_in_a # 使用样例同上 diff_result = find_diff_sorted(nums_a.copy(), nums_b.copy()) print(diff_result) ``` 这里展示了如何通过对原始列表排序并应用双指针技巧逐步对比得出最终结果 。 #### 总结 无论是选用哪种策略解决问题都需要考虑实际应用场景下的约束条件比如时间限制或是存储资源可用情况等因素影响选择最合适的方案实施求解过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你抱着的是只熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值