题目描述
在一个长度为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字节!