剑指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字节!

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/85053075