题目:
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:
- 思路一:利用hash,下标表示numbers数组中的数字,下标所对应的值为该数字出现的次数,遍历hash,若出现值大于1的就返回true,否则返回false。
- 思路二:同样利用hash,较思路一不同的是,不创建新的hash数组,在原数组的基础上
Java 思路一
package nowcoder;
public class S50_Duplicate {
public boolean duplicate(int[] numbers, int length, int[] duplicatioin){
if(numbers == null)
return false;
for (int i=0;i<length;i++){
if (numbers[i] < 0 || numbers[i] > length)
return false;
}
int[] hash = new int[length];
for (int i=0;i<length;i++){
hash[numbers[i]]++;
}
for (int i=0;i<length;i++){
if (hash[i] > 1) {
duplicatioin[0] = i;
System.out.println(duplicatioin[0]);
return true;
}
}
return false;
}
public static void main(String[] args){
S50_Duplicate s50 = new S50_Duplicate();
int[] numbers = {2,3,1,0,2,5,3};
int[] dup = new int[1];
System.out.println(s50.duplicate(numbers, numbers.length, dup));
}
}
Java 思路二
package nowcoder;
public class S50_Duplicate_new {
public boolean duplicate(int[] numbers, int length, int[] duplicatioin){
if(numbers == null)
return false;
for (int i=0;i<length;i++){
if (numbers[i] < 0 || numbers[i] > length)
return false;
}
for (int i=0;i<length;i++){
while (i != numbers[i]){
if (numbers[i] == numbers[numbers[i]]){
duplicatioin[0] = numbers[i];
System.out.println(duplicatioin[0]);
return true;
}
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
public static void main(String[] args){
S50_Duplicate_new s50 = new S50_Duplicate_new();
int[] numbers = {2,3,1,0,2,5,3};
int[] dup = new int[1];
System.out.println(s50.duplicate(numbers, numbers.length, dup));
}
}
Python
class Duplicate:
def duplicate(self,numbers,dup):
if not numbers:
return False
length = len(numbers)
for i in range(0, length):
if numbers[i] > length or numbers[i] < 0:
return False
while i != numbers[i]:
if numbers[i] == numbers[numbers[i]]:
dup[0] = numbers[i]
print(dup[0])
return True
else:
#交换
temp = numbers[i]
numbers[i] = numbers[temp]
numbers[temp] = temp
return False
if __name__ == '__main__':
test = Duplicate()
numbers = [1, 2, 1]
dup = [1]
print(test.duplicate(numbers, dup))