找出数组中重复的数字(c语言)
让人瑟瑟发抖的面试题
。
。
。
来我们看一下题目
在一个 长度为n的数组里的所有数字都在0~n-的范围内。数组中某些数字是重复的,但不知道有几个数字重复伦理,也不知道每个数字重复了多少次,找出任意一个重复的数字
注意:时间复杂度O(n),空间复杂度O(1)
怎么解决勒???
分析:利用题目中0~n-1范围,可以运用数组下标和数组内容进行比较
if (arr[i] != arr[arr[i]]),如果不相等时,进行调换,相等时,直接返回值
来看看代码
#include<stdio.h>#define SIZE(arr) sizeof(arr)/sizeof(arr[0])//数组长度void Swap(int *left, int *right){ int tmp = *left; *left = *right; *right = tmp;}int duplicate(int arr[],int len){ int i; if (len < 0) { return 0; } for (i = 0; i < len; i++) { if (arr[i] < 0 || arr[i]>len - 1)//限定数字大小 { return 0; } while (arr[i] != i) { if (arr[i] != i) { if (arr[i] != arr[arr[i]])//数组中数字是否等于以数字为下标的数字 { Swap(&arr[i], &arr[arr[i]]); } else { return arr[i]; } } } } return 0;}int main(){ int arr[] = {2,3,1,0,2,5,3}; printf("%d", duplicate(arr, SIZE(arr))); return 0;}
总结:数组中数据给定范围之后,可以多利用下标 i 进行求解
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。