leetcode初级算法(Java)--只出现一次的数字

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

说明:

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

示例 1:

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

解题思路:

  1. 给的是非空整数数组,且只有一个数字出现一次,其余数字都出现两次。

     这道题就是根据数组的特点来解题,因为其余数字都出现两次,两个相同的数字异或为0(不同为1,相同为0,任何数字与0异         或还是他本身),所以这道题最简单的办法是遍历数组异或出结果。

官方答案:

1.使用异或

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

2.使用map,遍历数组,取出出现次数为1的键

class Solution {
  public int singleNumber(int[] nums) {
    HashMap hash_table = new HashMap<>();

    for (int i : nums) {
      hash_table.put(i, hash_table.getOrDefault(i, 0) + 1);
      //getOrDefault(i,0)如果键i存在则取出对应的值,若不存在则值为0
    }
    for (int i : nums) {
      if (hash_table.get(i) == 1) {
         //取键的值若为1,则为所求值
        return i;
      }
    }
    return 0;
  }
}

3.使用list列表,若数字第一次出现则存入list,若第二次出现,则删除list中的值,最后返回list的值(只有一个值)。

class Solution {
  public int singleNumber(int[] nums) {
       List list = new ArrayList<>();
        for (int num : nums) {
            if (!list.contains(num)) {
                list.add(num);
            } else {
                list.remove((Object)num);
                //remove方法传入(int为数字,Integer为对象)数字时,表示为list下标,为对象时表示list值
            }
        }
        return list.get(0);
  }
}

 

你可能感兴趣的:(leetcode初级算法(Java)--只出现一次的数字)