剑指offer——面试题3:数组中的重复数字(题目1)

剑指offer——面试题3:数组中的重复数字

题目1.数组a的长度为n,每个元素为0-(n-1)的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。找出数组中任意一个重复额数字。例如a[7]={2,3,1,0,2,5,3},那么找出重复的数字为2或者3.

**用例思路:**先根据题意构思测试用例如下:
1.长度为n的数组包含1个或者多个重复数字。
2.数组中不包含重复数字。
3.无效输入的测试用例。(用例中的数组中包含大于n-1的数据;输入空指针)。

***编码思路:***可以扫描数组,当扫描数组索引为 i 位置上的数字m,我们先判断m是否等于i?
if (m == i) 则继续遍历下一个数据
else 不相等则将数字m和索引为m的数据比较,如果m = a[m],则m和i的位置的数据相等,即找到一个相等的,如果不相等,则将a[i]和a[m]对调。然后再遍历下一个数据。

示例: a[7]={2,3,1,0,2,5,3}
(1) a[0] = 2 != 0,然后和a[2]比较,a[2]=1 != 2;所以互换,数组变为a[7] ={1,3,2,0,2,5,3};
(2) a[1] = 3 != 1,然后和a[3]比较也不等,得到新数组a[7] ={1,0,2,3,2,5,3};
(3) a[2] = 2 == 2,数组不变,继续遍历下一个数。
(4) a[3] = 3 == 3,数组不变,继续遍历下一个数。
(5)a[4] = 2 != 4,然后和a[2]比较,相等,找到一个重复数字2,结束。

编码实现:

#include <stdio.h>
#define SIZE 7

void FindNum(int arry[],int length,int *DoubleNum)
{
	int i;
	int temp;
	int TempIdx;
	/*判断是否为无效用例*/
	if(arry == NULL || length == 0 || DoubleNum == NULL)
	{
		printf("数组长度为0或者指针为NULL\n");
		return;
	}
	for(i = 0; i < length; i++)
	{
		/*判断是否为无效用例*/
		if(arry[i] < 0 || arry[i] > length -1)
		{
			printf("数组元素不符合题意\n");
			return;
		}
	}
	for(i = 0; i < length; ++i)
	{
		if(*(arry+i) != i)
		{
			TempIdx = *(arry+i);
			if(arry[i] == arry[TempIdx])
			{
				*DoubleNum =arry[i];
				return;
			}
			else //不相等则继续做互换
		    {
			    temp = arry[i];
			    arry[i] = arry[TempIdx];
			    arry[TempIdx] = temp;
	        }
		}
		else
		{
			continue;
		}
		
	}
	//如果前面都没return,则可能不符合要求,默认return false。
	return;
}
 
void main( )
{
	int a[SIZE] =  {2,3,1,0,2,5,3};
	int length = SIZE;
	int DoubleNum = -1; //随意置成一个无效值。
    FindNum(a,length,&DoubleNum);
	if(DoubleNum + 1 != 0)
	{
		printf("数组中存在一个重复的元素为%d\n",DoubleNum);
	}
	else
	{
		printf("数组中不存在重复元素或者数组本身不符合题意");
	}
}

由于没有新增内存空间,只是在原先的数组上进行修改,所以空间复杂度为O(1);时间复杂度O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值