[C]去除数组中重复数字,并可按需保留多少个重复数字

#include<stdio.h>
#define N 10
int main(){
	int A[N] = {
		1,3,2,3,2,5,3,5,3,9
	};
	int len = N;
	int i;
	int j;
	int k;
	int temp = 0;
	
	for(i = 0; i < len; i++){
		for(j = i+1; j < len; j++){
			if(A[j] == A[i]){
				if(temp != 0){
					for(k = i; k < len - 1; k++){
						A[k] = A[k + 1];	
					}
					len--;
					i = 0;
				}
				temp = 1;
			}
		}
		temp = 0;
	}
	
	printf("新数组:\n");
	for(i = 0; i < len; i++){
		printf("%d\n", A[i]);
	}
	printf("新数组大小:\n%d\n", len);
	return 0;
}

# 题目重述 给定一个整数数组,要求去除其中的重复数字,使每个元素只出现一次,保持原有顺序。最终输出去重后的数组元素。 --- # 代码概述 本题通过遍历数组使用“双指针”技术实现去重:一个指针记录当前不重复元素的末尾位置,另一个遍历整个数组。对于已排序或未排序数组均适用(此处按一般情况处理)。 --- # 给出答案(带注释的代码块) ```c #include <stdio.h> int main() { int n; printf("请输入数组长度: "); scanf("%d", &n); int arr[100]; // 假设最大容量为100 printf("请输入 %d 个整数: ", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } if (n == 0) { printf("数组为空\n"); return 0; } int newSize = 1; // 去重后的新长度,初始第一个元素必保留 for (int i = 1; i < n; i++) { int isDuplicate = 0; // 查找当前元素是否已在去重部分出现过 for (int j = 0; j < newSize; j++) { if (arr[j] == arr[i]) { isDuplicate = 1; break; } } if (!isDuplicate) { arr[newSize++] = arr[i]; } } // 输出结果 printf("去重后的数组: "); for (int i = 0; i < newSize; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` --- # 代码解析 1. **输入处理**:读取数组长度和元素。 2. **特殊情况判断**:若数组为空,直接返回。 3. **去重逻辑**: - 使用 `newSize` 表示去重后有效长度。 - 从第二个元素开始遍历,检查其是否已存在于 `arr[0..newSize-1]` 中。 - 若不存在,则将其加入末尾。 4. **输出结果**:打印去重后的元素。 --- # 知识点(列出该代码中遇到的知识点) - **数组去重逻辑**:通过嵌套循环判断元素是否已存在,避免重复录入。 - **双指针思想应用**:外层遍历原数组,内层搜索结果区,实现原地去重。 - **顺序保持策略**:按原顺序逐个判断,确保输出顺序与输入一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值