剑指offer题目:数组中重复的数1

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
第一种思路:
简单的遍历,然后重复的数字累加;
个人观点:可能这个复杂度比较高,虽然我不会算,这是我看到这个题目首先就想到的,我一开始还以为这道题目简单,就想看看别人怎么做的,一看,自己的是最差劲的,怪尴尬的

#include<iostream>
using namespace std;
int main()
{
	int count = 1; 
	int i = 0;
	int arr[7] = { 2,3,1,0,2,5,3 };
	for (i = 0; i < 7; i++)
	{
		for (int j = i + 1; j <= 7; j++)
		{
			if (arr[i] == arr[j])
			{
				count++;
			}
		}
		if (count != 1)
		{
			cout << arr[i];
			cout << "总共出现了:" << count << "次" << endl;
			count = 1;
		}
	}
	return 0;
}

第二种思路:修改原数组顺序
因为题目当中说:在一个长度为n的数组里的所有数字都在0到n-1的范围内,所以如果不重复的话,那就应该一个数字对应一个下标;可是如果重复了的话,同一个数字可能至少对应两个下标,当元素和下标不同的时候就交该元素的位置和以该元素为下标的元素的位置,直到元素和下标相等,以一定会遇到两个不同下标对应的元素相同,此时输出结果,即可输出第一个重复的元素
这是我查了一些网上的方法,根据自己的理解写的,然后就发现我想的果真太少都木有考虑各种不符合的情况

#include<iostream>
//#include<stdio.h>
using namespace std;
void Change(int &a, int &b);
int FindNum(int arr[], int size);
int FindNum(int arr[], int size)
{
	int i;
	if (arr == NULL || size <= 0)
	{
		return -1;
	}
	for (i = 0; i < size; i++)
	{
		if (arr[i] < 0 || arr[i] >= size)
			return -1;
	}
	for (i = 0; i < size; i++)
	{
		while (arr[i]!=i)
		{
			if (arr[i] ==arr[arr[i]])
			{
				return arr[i];
			}
			else
			{
				Change(arr[i], arr[arr[i]]);
				//cout << arr[i] <<"	"<< arr[arr[i]] << endl;
			}

		}
	}
	return -1;
}
void Change(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int arr[7] = {2,3,1,0,2,5,3};
	int result=FindNum(arr,7);
	cout <<"重复的输出是:" <<result << endl;
	return 0;
}

在这里插入图片描述
我再研究研究另外两种思路,然后再总结一下,加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值