博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020-12-05-LeetCode中“只出现一次的数字”题解
阅读量:3951 次
发布时间:2019-05-24

本文共 1895 字,大约阅读时间需要 6 分钟。


layout: post

title: “LeetCode中只出现一次的数字”
date: 2020-12-05
description: “LeetCode刷题”
tag: LeetCode


LeetCode中“只出现一次的数字”题解

题目

难度 简单

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

说明:

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

示例 1:

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

示例 2:

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

题解

方法一:暴力查找

两次循环,代码略

方法二:排序

使用快速排序,复杂度O(nlogn)

方法三:hashmap哈希表

class Solution {
public int singleNumber(int[] nums) {
// 创建hashmap,键为对应值在数组nums中出现的次数 HashMap
map = new HashMap<>(); // 遍历数组,存入hashmap for (int i = 0; i < nums.length; i++) {
// 获取此值在hashmap中的次数 Integer count = map.get(nums[i]); // 将count++,如果第一次出现,将count赋值为1 count = count == null ? 1 : ++count; // 将其值及其对应出现次数存入hashmap中 map.put(nums[i], count); } // 遍历hashmap哈希表 for (Integer value : map.keySet()) {
// 如果出现次数为1,将对应值返回 Integer count = map.get(value); if (count == 1) {
return value; } } return -1; // can't find it. }}
复杂度分析:

​ 时间复杂度:O(n)

​ 空间复杂度:O(N)

方法四:异或运算

异或运算

运算法则:
  1. a ^ b = b ^ a

  2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

  3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.

  4. a ^ b ^ a = b.

    异或运算

    1、异或是一个数学运算符。应用于逻辑运算。

     2、例如:真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值相 异结果为真。

    n^0=n n^n=0,即任何数与0进行异或,为它本身,两个相同的数进行异或运算,会得到0。

    一道有意思的题目:

    ​ 很多成对出现数字保存在磁盘文件中,注意成对的数字不一定是相邻的,如2, 5,3, 4, 7,3, 4, 2,5……,由于意外有一个数字消失了,如何尽快的找到是哪个数字消失了?

    ​ 思路:由于有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次。用搜索来做就没必要了,利用异或运算的两个特性,代码与此题类似,同一问题

    特性

    1.自己与自己异或结果为0,

    2.异或满足 交换律。

class Solution {
public int singleNumber(int[] nums) {
// 初始化res 为 nums[0] int res = nums[0]; // 遍历数组,依次进行异或运算,由于异或运算具有交换性,所以最后的结果即为出现一次的数与0异或 for(int i = 1; i < nums.length; i++){
res ^= nums[i]; } // 返回此数 return res; }}
复杂度分析

​ 时间复杂度:O(N)

​ 空间复杂度:O(1)

转载地址:http://hzwzi.baihongyu.com/

你可能感兴趣的文章
用弹性工作制留住员工
查看>>
知识=经验×反思2
查看>>
领导者如何发现关键问题
查看>>
学习无为领导力
查看>>
卓越领导看过程
查看>>
领导力与各种循环挑战
查看>>
达成谈判协议 - 避免操之过急
查看>>
销售人说话“十大忌”
查看>>
营销中的“战略非对称”
查看>>
android 如何开关Mediatek开发的Feature
查看>>
Android电话功能各部分深入探讨
查看>>
Android应用技巧总结
查看>>
Android创建sdcard详细图解
查看>>
Android开发:如何实现TCP和UDP传输
查看>>
Android电源管理相关应用技巧分享
查看>>
Android录音失真具体解决方案
查看>>
Android根文件系统相关应用介绍
查看>>
Android文件系统深入剖析
查看>>
Android判断网络状态方法详解
查看>>
在Android上实现Junit单元测试的四部曲
查看>>