题解 | #数组中重复的数字#
数组中重复的数字
http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
/*
整体的思路是:对于其中存储的数字在0到n-1范围的长度为n的数组,可以使用此方法。将值为i的元素调整到第i个位置,在调整的过程中发现重复元素。
时间O(N),空间O(1)
*/
int n = numbers.length;
//无效用例:空指针和长度为0(前者应当在前面)
if(numbers == null || n <= 0){
return -1;
}
for(int i = 0; i < n; i++){
//无效用例:数的范围超了
if(numbers[i] < 0 || numbers[i] >= n){
return -1;
}
while(numbers[i] != i){
if(numbers[i] == numbers[numbers[i]]){
return numbers[i];
}
else{
int temp = numbers[i];
numbers[i] = numbers[numbers[i]];
//此处卡题:由于numbers[i]已经被修改,中括号中也需要用temp而非numbers[i],否则某些用例中会出现死循环
numbers[temp] = temp;
}
}
}
return -1;
}
}