这个问题与Find the first un-repeated character in a string有关,其中输入是字符数组,我们可以使用大小为256的散列。
但是,如果,
数组中的元素是宽范围的整数,散列可能非常昂贵。
数组包含异构元素,整数或字符,那么hash如何解决这个问题。
我们可以使用蛮力方法扫描每个元素的整个数组,但在最坏的情况下,它需要O(n²)。
还有其他想法吗?
答案 0 :(得分:1)
离线版:对这样的矢量进行排序:
vector<std::pair<int,int> > data;
for (int i=0;i<orignalVec.size();++i)
data.push_back( make_pair(originalVec[i] , i ) );
然后扫描矢量,寻找一对第一个值相同且位置值最小的一对。这会得到O(NlogN)
在线版本。使用std::map
(O(NlogN)
)std::unordered_map
(O(N)
)。
如果数组中的元素是宽范围的整数,则散列可能非常昂贵。
为什么呢? Hash旨在解决这个问题不是吗?
如果数组包含异构元素,整数或字符,那么hash如何解决这个问题。
为每个人写下不同的哈希函数。对于int
,float
,std::string
等类型,我认为STL内置了哈希值。
对于其元素不支持比较操作的异构容器,哈希是我唯一可以提出的。
答案 1 :(得分:1)
int[] numbers = {1, 5, 23, 2, 1, 6, 3, 1, 8, 12, 3};
Arrays.sort(numbers);
for (int i = 1; i < numbers.length; i++) {
if (numbers[i - 1] == numbers[i]) {
System.out.println("Repeated numbers are : " + numbers[i]);
}
}