LeetCode 136.只出现一次的数字【Java】

目录

  • 1. 题目
  • 2. 思路与代码

1. 题目

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

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

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

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

2. 思路与代码

题目说序列的元素除了一个元素只有一个以外,其余的元素都有两个,我们可以利用这个点进行思考

方法一: 最直接的方法;将数组排序,两个两个元素进行对比,如果相同则跳过,如果不同则返回序列小的元素,如果全部相同则要找的元素在最后一位,返回即可

class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        for(int i = 1; i < nums.length - 1; i += 2){
            if(nums[i - 1] == nums[i]){
                continue;
            }
            else{
                return nums[i - 1];
            }
        }
        return nums[nums.length - 1];
    }
}

方法二: 位运算 参考leetcode官方解答
//位运算就离谱,谁能想到orz

使用位运算巧妙地利用到了异或的特性

  1. 任何数和其本身的异或都是0
  2. 任何数和0异或都是其本身

直到这两个特性这道题就很简单了

将所有数异或,相同的两个数根据特性一异或后就是0,最后只剩下0和不成对的那个数,再根据特性二,答案就出来了

class Solution {
    public int singleNumber(int[] nums) {
        int singlenum = 0;
        for (int i = 0; i < nums.length; i++) {
            singlenum ^= nums[i];
        }
        return singlenum;
    }
}

你可能感兴趣的:(leetcode,java,算法)