只出现一次的数字

题目链接:力扣

题目描述:

只出现一次的数字

难度简单2130

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

说明:

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

示例 1:

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

示例 2:

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

通过次数544,988提交次数757,853

二,代码与思想:

package zyh.example.demo.suanfati.leetcode.simple;

import java.util.HashSet;
import java.util.Set;

/**
 * @ClassName SingleNumber
 * @Author zhangyonghui
 * @Description 只出现一次的数字
 * @Date 2021/12/1 11:15
 * @Version 1.0
 **/
public class SingleNumber {

      public static void main(String[] args) {
            // [4,3,1,2,1,2,3]
            // int[] nums = new int[]{4, 3, 1, 2, 1, 2, 3, 5, 6, 7, 8, 6, 7, 5, 4, 9, 9};
            int[] nums = new int[]{4,3,1,2,1,2,3};
            int number = singleNumber2(nums);
            System.out.println("number = " + number);
      }

      /**
       * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
       * 之前的元素和现在这个元素进行比较,如果不一样则继续比较,如果一样则将这两个元素挪到前边,以后不再比较,然后开始下一个元素;
       * @param nums
       * @return
       */
      public static int singleNumber(int[] nums) {
            int numsLength = nums.length;
            int cishu = 0;
            for (int i = 1; i < numsLength; i++) {
                  int nowNum = nums[i];
                  // [4,3,1,2,1,2,3]
                  for (int j = cishu; j < i; j++) {
                        int preNum = nums[j];
                        if (preNum == nowNum) {
                              int temp1 = preNum;
                              nums[j] = nums[cishu];
                              nums[cishu] = temp1;
                              int temp2 = nowNum;
                              nums[i] = nums[cishu + 1];
                              nums[cishu + 1] = temp2;
                              cishu += 2;
                              break;
                        }
                  }
            }
            return nums[numsLength - 1];
      }


      /**
       * 使用额外内存空间,HashSet来实现:
       * Set集合特点:无序,不可重复;
       * 底层原理,HashSet是使用hash表实现的,是将HashMap的value作为一个常量值,然后使用HashMap的key来存储数据;
       * @param nums
       * @return
       */
      public static int singleNumber2(int[] nums) {
            Set<Integer> hashSet = new HashSet<>();
            for (int num : nums) {
                  //如果可以添加,说明还没有重复元素,继续往后遍历数组元素;
                  //如果添加失败,则说明有了重复元素,那么将该元素从Set集合中删除,同时继续往后遍历数组元素;
                  if (hashSet.add(num)) {
                        continue;
                  }else{
                        hashSet.remove(num);
                  }
            }
            //最后遍历完成之后,集合中仅剩下一个元素,即返回结果
            return hashSet.iterator().next();
      }


}

上一篇:Android Material Design系列之FloatingActionButton和Sna


下一篇:Android Material Design系列之RecyclerView和CardView