让人瑟瑟发抖的面试题
。
。
。面试
来咱们看一下题目
在一个 长度为n的数组里的全部数字都在0~n-的范围内。数组中某些数字是重复的,但不知道有几个数字重复伦理,也不知道每一个数字重复了多少次,找出任意一个重复的数字
注意:时间复杂度O(n),空间复杂度O(1)数组
怎么解决勒???
分析:利用题目中0~n-1范围,能够运用数组下标和数组内容进行比较
if (arr[i] != arr[arr[i]]),若是不相等时,进行调换,相等时,直接返回值来看看代码ide
#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 进行求解code