顺序表---数组元素去重

给一个非严格递增排列的数组,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 

非严格递增排列,说明了如果元素有重复出现,那么就一定在一块出现,原地删除就是直接在给定数组中进行操作,最后要返回删除后数组的长度。

我们使用函数DuplicateDataRemove操作。

int DuplicateDataRemove(int* arr, size_t arrsize);

传入了需要去重的数组arr首地址,以及arr的长度。

我们使用两个指针/下标,一个dest用于遍历整个数组元素,另一个src用于替换重复出现的元素。

由于去重,我们赋值dest为1,src为0。

	int src = 0;
	int dest = 1;

那么当我们dest指向的元素与src不同时,我们将src后一位空间中的数据替换为dest指向的元素,替换后将dest增1,这样就把有效元素前移了;当dest指向的元素与src相同的时候,那么就直接dest向后继续遍历,直到dest走到数组的末尾停止,即while循环条件dest<arrsize。

	while (dest < arrsize)
	{
		if (arr[src] != arr[dest])
		{
			src++;
			arr[src] = arr[dest];
			dest++;
			//arr[++src] = arr[dest++];
		}
		else
			dest++;
	}

循环结束后,我们将所有的有效元素,也就是没有重复的元素放在了数组arr的前面位置处,此时arr[src]表示这个数组的最后一个有效元素,那么去重后的长度就是src+1。如果使用指针,注意长度的计算使用src+1减去首地址arr即可。下标由于是整型,直接返回就行。

return src+1;//下标形式

图解如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值