题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
leetcode对应题目:
总结:参数时 numbers[]的形式也可以直接当做指针调用;用取反来标记是否访问过该元素,用数组的下标来标记。和leetcode题目对比很简单,因为他直接说了0~n-1,太好想到利用数组下标了。
拓展:
如果不允许修改数组呢?创建临时数组。
如果要找到所有重复的数字呢?修改程序,在number[index]小于0的都弄到数组中。
如果告诉你是在一个递增数组中,范围0~n-1,查找某个缺失的数字?使用二分查找的方法
如果在一个单调递增的数组中找到数字和下标相等的?使用二分查找的方法。
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(length <= 1 || !duplication ||!numbers) return false;
for(int i = 0 ; i< length;i++){
int index = abs(numbers[i]);
if(numbers[index] < 0){
*duplication = index;
return true;
}
numbers[index] = -numbers[index];
}
return false;
}
};
数组和指针的区别:size1 计算的是数组data1的大小,为4*5 = 20字节。size2 计算的是指针data2的大小,为4字节。size3的结果为4字节。c/c++中,当数字作为函数的参数进行传递时,数组就自动退化为同类型的指针。
int getsize(int p[]){
return sizeof(p);
}
int main(){
int data1[] = {1,2,3,4,5};
int *data2 = &data1;
int size1 = sizeof(data1);
int size2 = sizeof(data2);
int size3 = getsize(data1);
printf("%d %d %d",size1,size2,size3);// 20 4 4
}