最近很久没刷题了,面试官给了这么一道题,只给10分钟时间,没仔细想明白最优方法,只想出了用map来存,其实这就有问题了,算法算法,就是让你给最优的答案,时间要快;
网上找了一些人的写法,发现我没看懂进位运算,是我脑子笨,还是大家都很聪明?没必要用这么复杂的吧
这个算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
就10分钟我哪想的出来最优的,如果不用额外空间,那使用快排再加一次遍历也能找出时间复杂度就O(NlogN) 了
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> sMap = new HashMap<>();
for(int n:nums){
sMap.put(n, sMap.getOrDefault(n, 0) + 1);
}
for(int i:sMap.keySet()){
if(sMap.get(i) == 1){
return i;
}
}
return -1;
}
}
注意看清楚题目:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 二次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,1]
输出:1
示例 2:
输入:nums = [4,1,2,1,2]
输出:4
示例 3:
输入:nums = [1]
输出:1
这道题就可以用异或的方法解答:
二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i=0; i <nums.length;i++){
result ^= nums[i];
}
return result;
}
}
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100]
输出:100
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
方法想了很久才想明白,脑子真不好使了;
比如 [2,2,3,2],
0010 (2)
0010 (2)
0011 (3)
0010 (2)
———— 每一位mod3, 是不是就去掉了相同的三位啊,哭晕在厕所,咋这么简单
0011 (3)
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i=0; i <32;i++){
int temp =0;
for(int j =0;j< nums.length; j++){
temp +=( nums[j] >> i ) & 1;
}
result |= (temp%3) << i;
}
return result;
}
}