概述
如题,其要求给出最优的时间与空间复杂度。
---- 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;
}
最后
以上就是迷路月亮为你收集整理的求解:一个数组中除了某个数字出现一次,其它均出现两次,求出该数?的全部内容,希望文章能够帮你解决求解:一个数组中除了某个数字出现一次,其它均出现两次,求出该数?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复