LeetCode面试题

热身

1. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

解法1:列表操作

class Solution {
    
    
    // 列表操作
    public int singleNumber(int[] nums) {
    
    
        List<Integer> list = new ArrayList<>(); // 创建新的列表
        for(int num : nums) {
    
    
            if(!list.contains(num)) {
    
     // 列表不包括 num
                list.add(num);
            } else {
    
    
                list.remove((Object)num); // 移除重复 num
            }
        }
        return list.get(0);
    }
}

解法2:哈希表

class Solution {
    
    
    public int singleNumber(int[] nums) {
    
    
        Map<Integer, Object> map = new HashMap<>();
        for(int num : nums) {
    
    
        	// 判断哈希表中是否已存在值
            if(!map.containsKey(num)) {
    
     
                map.put(num, null);
            } else {
    
    
                map.remove(num);
            }
        }
        // 查找对应的 key
        return map.keySet().iterator().next(); 
    }
}

解法3:位操作

概念
如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位
a ⊕ 0=a
如果我们对相同的二进制位做 XOR 运算,返回的结果是 0
a ⊕ a=0
XOR 满足交换律和结合律
a ⊕ b ⊕ a = (a ⊕ a) ⊕ b= 0 ⊕ b = b

class Solution {
    
    
    public int singleNumber(int[] nums) {
    
    
        int res = 0;
        for(int num : nums) {
    
    
            res ^= num;
        }
        return res;
    }
}

2. 多数元素

多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
解法1:暴力解法

class Solution {
    
    
    public int majorityElement(int[] nums) {
    
    
    	// 众数数量
        int ans = nums.length / 2; 
        // 依次遍历统计每一个元素出现的次数
        for(int num : nums) {
    
    
            int count = 0;
            for(int a : nums) {
    
    
                if(a == num) count++;
            }
            if (count > ans) {
    
    
                return num;
            }
        }
    }
}

解法2:排序算法

class Solution {
    
    
    public int majorityElement(int[] nums) {
    
    
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

猜你喜欢

转载自blog.csdn.net/CrazyQiQi/article/details/104631694
今日推荐