数组、map
一 题目
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
二 思路
暴力解法:依次遍历数组元素,判断是否有与当前元素重复的元素,如果有,赋值并返回true,否则返回false
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if(numbers[i] == numbers[j]){
*duplication = numbers[i];
return true;
}
}
}
return false;
}
};
使用哈希表,两次遍历,第一次统计每个数字出现的次数,第二次查找重复的数字,并输出第一个重复的数字。
C++:
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
unordered_map<int,int>map;
//统计每个数字出现的次数
for(int i=0; i<length; i++){
map[numbers[i]]++;
}
//找到第一个重复数字
int cnt = 0;
for(int i=0; i<length; i++){
if(map[numbers[i]] > 1){
duplication[cnt++] = numbers[i];//如果只是赋值给duplication[0],后面重复的数字会把第一个覆盖掉
return true;
}
}
return false;
}
};
python:
方法1:关于哈希表的python实现参考 40-数组中只出现一次的数字 的代码
方法2: 创建辅助列表,扫描数组时判断每个元素是否在辅助列表中,如果不在则添加到辅助列表中,遇到重复元素时则直接赋值给duplication[0]
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
temp = []
for num in numbers:
if num in temp:#遇到重复数字
duplication[0] = num
return True
temp.append(num)#初始的temp为空,所以会将数字添加到temp中,在每次添加一个数字前,都判断是否已经添加过,即重复
return False
方法3:使用python标准库collections中的Counter方法
-
# -*- coding:utf-8 -*- import collections class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False #flag = False def duplicate(self, numbers, duplication): flag = False obj = collections.Counter(numbers) for k,v in obj.items(): if v > 1: duplication[0] = k flag = True break return flag