我是靠谱客的博主 迷路月亮,最近开发中收集的这篇文章主要介绍求解:一个数组中除了某个数字出现一次,其它均出现两次,求出该数?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如题,其要求给出最优的时间与空间复杂度。

---- 2019年春招珍爱网笔试题

1. 哈希法

新建一个数组,目的存储数组元素出现的次数,其数组长度大小为(n/2+1)。
为防止在进行hash求索引时,数组越界,可以通过取模得到索引下标。

时间复杂度O(n)、空间复杂度O(n)

public int soultion1(int[] num){
int[] a = new int[num.length/2+1];
for(int i=0;i<num.length;i++){
if(num[i]>num.length){
int index = num[i]%length;
num[index]++;
}else{
num[i]++;
}
}
for(int i=0;i<a.length;i++){
if(a[i]==1){
return i;
}
}
//error
return -1;
}

2. 利用hashMap

方法2与方法1原理类似,一样是利用hash,但不需要考虑数组越界的问题。

时间复杂度O(n)、空间复杂度O(n)


public int solution2(int[] num){
Map<int,int> map = new HashMap<>();
for(int i=0;i<num.length;i++){
if(map.containKey(num[i])){
map.put(num[i],++map.get(num[i]));
}else{
map.put(num[i],1);
}
}
//遍历map的value值
for(int key:map.keySet()){
if(map.get(key) == 1){
return key;
}
}
//error
return -1;
}

3. 利用hashSet不重复元素特性,再根据辅助boolean数组记录索引有效性。

时间复杂度O(n)、空间复杂度O(n)

4. 采用异或的方法

异或具有自反性的特点,即A^ B^ B=A

根据这一特性,我们只需要遍历一遍数组即可找到唯一的那个元素。

时间复杂度O(n)、空间复杂度O(1)


public int soultion4(int[] num){
int anwser = num[0];
for(int i=1;i<num.length;i++){
anwser = anwser ^ num[i];
}
return anwser;
}

最后

以上就是迷路月亮为你收集整理的求解:一个数组中除了某个数字出现一次,其它均出现两次,求出该数?的全部内容,希望文章能够帮你解决求解:一个数组中除了某个数字出现一次,其它均出现两次,求出该数?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部