Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1] Output: 1
Example 2:
Input: [4,1,2,1,2] Output: 4
本菜鸟:
class Solution {
public int singleNumber(int[] nums) {
List<Integer> list= new ArrayList();
int sum = 0;
for(int i=0;i<nums.length;i++){
sum += nums[i];
if(!list.contains(nums[i])){
list.add(nums[i]);
}
}
int res = 0;
for (int i = 0; i < list.size(); i++) {
res = list.get(i) + res;
}
return 2*res-sum;
}
}
时间复杂度O(n^2),比较差,所以花费了166ms,效果倒数。
稍微改进一下的版本:
@akashs73
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
int a = nums[i];
if(map.containsKey(a)) {
map.remove(a);
}else {
map.put(a, 1);
}
}
return (int) map.keySet().toArray()[0];
大神的代码:
int x = 0; for(int a: nums) x^=a;
return x;
仅仅两行,时间复杂度为O(n),比这道题的在线提交的100%java代码都快。
这里用到了异或的性质:x^y^x=y;
本文探讨了在整数数组中查找唯一出现一次元素的有效算法。介绍了三种解决方案,包括使用额外列表、哈希映射及异或操作。重点分析了异或算法,其凭借线性时间复杂度和不使用额外内存的优势,成为最优解。
708

被折叠的 条评论
为什么被折叠?



