(☆☆)50、数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

leetcode对应题目:

442. 数组中重复的数据                                      题目解答

448. 找到所有数组中消失的数字                        题目解答       

287. 寻找重复数                                                 题目解答  

总结:参数时 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 
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值