leetcode136:只出现一次的数字

package com.mxnet;

import java.util.HashSet;

public class Solution136 {

    public static void main(String[] args) {

    }

    /**
     * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
     * 说明:
     * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
     *
     * @param nums
     * @return
     * 使用hash结构,但是要花费额外空间
     * 思路:
     * 1. 由于hash结构的元素不重复特性,
     * 2. 将所有元素尝试加入hash集合
     * 3. 在添加的过程中,如果该元素已经存在hash集合中,则删除
     * 4. 若不在hash集合中,则添加
     * 5. 则到最后时hash集合中之上下不重复的元素,取出来返回即可
     */
    public int singleNumber1(int[] nums) {
        int single = 0;
        HashSet<Integer> integers = new HashSet<>();
        for (int num : nums) {
            //该元素若已经存在hash集合中则删除
            if (integers.contains(num)) {
                integers.remove(num);
            } else {
                //若不存在则添加
                integers.add(num);
            }
        }
        //取出不重复的元素
        for (Integer integer : integers) {
            single = integer;
        }
        return single;
    }

    /**
     * 使用位运算的方法,不需要额外空间
     * @param nums
     * @return
     * 思路
     * 1. 由位运算的性质
     * 2. 不需要额外空间即可知道不重复元素
     */
    public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
             single ^= num;
        }
        return single;
    }
}
posted @ 2022-08-24 20:42  mx_info  阅读(22)  评论(0)    收藏  举报