剑指offer-50:数组中重复的数字

题目描述

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

思路

看代码吧
由条件可知,数组里面的数是小于数组长度。那么可以根据这个条件遍历数组改变每个数组的值对应下标的数值。

举个例子:
2,3,1,0,2,5,3
当下标i=0时:改变下标为2的数值
2,3,8,0,2,5,3
当下标i=1时:改变下标为3的数值
2,3,8,7,2,5,3
当下标i=2时:改变下标为1的数值
2,10,8,7,2,5,3
当下标i=3时:改变下标为0的数值
9,10,8,7,2,5,3
当下标i=4时:发现数值8>7(数组长度),说明出现过2。
9,10,8,7,2,5,3

代码

public class Solution50 {

    /**
     *
     * @param numbers  数组
     * @param length   数组的长度
     * @param duplication 存储重复数字
     * @return 如果输入无效 返回false
     */
    public boolean duplicate(int[] numbers,int length,int[] duplication) {


        if(numbers==null||length<0)
            return false;
        for (int num:numbers) {

            if(num<0||num>length-1)
                return false;
            
        }
        for (int i=0;i<length;i++){

            int index=numbers[i]%length;
            if(numbers[index]>=length){
                duplication[0]=index;
                return true;
            }
            numbers[index]+=length;

        }

        return false;

    }


    public static void main(String[] args) {
        int[] arr={2,3,1,0,2,5,3};
        int[] duplication=new int[1];
        boolean isValue=new Solution50().duplicate(arr,arr.length,duplication);
        BeanUtil.print(isValue);
        if(isValue)
        BeanUtil.print(duplication[0]);

    }

}

额外的知识点

(1)boolean不是占1位,计算机处理处理数据的最小单元是1字节,一般1位的话,其余7位会被0补齐。
(2)在java虚拟机规范中,JVM没有用于操作boolean的字节码指令,在编译后用int的数据类型代替boolean,此时boolean占4字节。
(3)boolean[]数组编译后会被byte[]数组代替,此时的boolean占1字节。
总结:boolean单独存在占4字节,在boolean[]中占1字节!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值