题目:

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

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

说明:

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

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

示例 1:

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

示例 2:

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

解题思路:

  • 排序数组,如果某个数与前后两个数均不相等则该数只出现一次。
  • 哈希映射,key 为每个数的值,value 为每个数出现的频率。最后找到 value = 1 的数返回。
  • 异或运算,直接进行异或操作求值。不使用额外空间。

异或运算(XOR)解题是最优雅的解法,且不使用额外空间,其概念为:

  • 如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位

    • a XOR 0 = a
  • 如果我们对相同的二进制位做 XOR 运算,返回的结果是 0
    • a XOR a = 0
  • XOR 满足交换律和结合律

代码:

借助哈希表:

Java:

哈希映射频率(可用于字符串出现频率的计算)

class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
Integer count = map.get(num); //get() 方法获取元素不存在时返回null
count = count == null ? 1 : ++count; //count为null 时证明元素不存在,则频率改为1,否则count频率+1
map.put(num, count); //加入映射表
}
for (Integer num : map.keySet())
if (map.get(num) == 1) return num; //返回频率为1的数
return 0;
}
}

Python:

1、借助 try...except...,只适用于该题中重复元素重复出现次数为偶数次。

class Solution(object):
def singleNumber(self, nums):
hash_map = {}
for i in nums:
try:
hash_map.pop(i) # 尝试移除该数
except:
hash_map[i] = 1 # 移除失败证明字典内没有该值,则添加到字典
return hash_map.popitem()[0] #最后字典中只剩下一个键值对,返回其键值

2、字典映射频率(可用于字符串出现频率的计算)

class Solution:
def singleNumber(self, nums: List[int]) -> int:
hash_map = {}
for num in nums:
hash_map.setdefault(num, 0)
hash_map[num] += 1 # 每次出现频率加一
for k, v in hash_map.items(): #二次遍历返回频率为1的数
if v == 1:
return k
return 0

亦或运算(XOR):

其处理逻辑可以简单理解为:

输入: [2 , 3 , 2 , 4 , 3] ,  初始化 result = 0

result = 0  XOR  2  =  2
result = 2 XOR 3 = [2 , 3]
result = [2 , 3] XOR 2 = 3
result = 3 XOR 4 = [3 , 4]
result = [3 , 4] XOR 3 = 4 返回 result = 4

异或运算是位操作中最基本运算之一,以上是为方便理解异或运算而简化抽象的逻辑,如果想进一步了解位操作可以参考Wiki百科。

高级程序设计语言异或运算表示符号一般是 ^

Java:

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

Python:

class Solution:
def singleNumber(self, nums: List[int]) -> int:
result = 0
for num in nums:
result = result ^ num
return result

欢迎关注微.信公.众号爱写Bug

LeetCode 136:只出现一次的数字 Single Number的更多相关文章

  1. Java实现 LeetCode 136 只出现一次的数字

    136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现 ...

  2. python(leetcode)-136只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  3. Leetcode 136.只出现一次的数字 By Python

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  4. LeetCode 136. 只出现一次的数字(Single Number)

    题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  5. LeetCode | 136. 只出现一次的数字Ⅰ Ⅱ

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  6. [Swift]LeetCode136. 只出现一次的数字 | Single Number

    Given a non-empty array of integers, every element appears twice except for one. Find that single on ...

  7. 【Leetcode】【简单】【136. 只出现一次的数字】【JavaScript】

    题目描述 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外 ...

  8. Leetcode 137. 只出现一次的数字 II - 题解

    Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...

  9. Leetcode 260.只出现一次的数字III

    只出现一次的数字III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5 ...

随机推荐

  1. Python语法速查:目录

    1. 数据类型与内置函数 2. 列表.元组.字典.集合操作 3. 字符串格式化 4. 字符串常用操作 5. 运算符.math模块.表达式 6. 循环与迭代 7. 函数基础 8. 类与对象 9. 函数进 ...

  2. [Go] 实现面向对象中的继承和覆盖方法

    go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...

  3. jenkins 分布式配置+allure集成+邮件发送

    jenkins节点配置+allure集成+邮件发送这一套走下来感觉很麻烦,要配置的东西太多了,所以在此记录一下,防止以后忘了. 环境: 主机master:腾讯云服务器ubuntu18.04 执行机sl ...

  4. idea中导入别人的vue项目并运行

    1. 下载node.js 在搭建vue的开发环境之前,先下载node.js,下载地址:https://nodejs.org/en/ https://blog.csdn.net/antma/articl ...

  5. IDEA 护眼色设置

    首先做一些简单的记录,护眼色 等等的设置很久以前机器上已经设置过了,今天偶尔要在其他机器上重新做一些设置反而忘记了很多步骤, 设置后的HTML页面如下图所示: 默认情况下,当只是设置General通用 ...

  6. 连接SpringBootAdmin 异常 Name or service not known

    环境: 服务器:Linux 客户端:Windows 当客户端连接到SpringBootAdmin的时候,报了如下异常 明明显示可以连接了,但是就是报了客户端INSTANCE DOWN   (down机 ...

  7. Xcode 中配置 clang-format 格式化 C++ 代码

    Xcode 自带的代码格式化功能(control + I)很有限,其 "格式化" 仅限于设置缩进,代码里面的格式是不会处理的.所以需要借助额外的工具来完成代码的美化. clang- ...

  8. java架构之-负载均衡-Ribbon 的使用

    一. 什么是负载均衡负载均衡就是分发请求流量到不同的服务器.负载均衡一般分为两种:1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 二. spring- - cloud- - ...

  9. GO-切片拷贝以及赋值

    一.拷贝 package main import "fmt" func main(){ //copy函数,把一个切片copy到另一个切片之上 var a [1000]int=[10 ...

  10. SpringBoot启动项目时提示:Error:(3, 32) java: 程序包org.springframework.boot不存在

    场景 在IDEA中新建SpringBoot项目,后启动项目时提示: Error:(3, 32) java: 程序包org.springframework.boot不存在 实现 将pom.xml中par ...