IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【算法】136. 只出现一次的数字 -> 正文阅读

[数据结构与算法]【算法】136. 只出现一次的数字

这是来自力扣的第136道算法题,题目是:

图片

看到这道题,我第一想法是来个双重for循环,一个一个做比较......?先不说能不能行(小声bb:我没试过),这样做太消耗时间了。

仔细审题后,我看到下面相关标签写着“位运算”,于是乎我就在想位运算怎么做这道题呢??!!不清楚位运算的小伙伴,可以看下咱之前的文章【Java | 运算符】。

经过我看了一会题解和思考后,知道了怎么做

图片


首先,先来了解一下位运算的异或(^)运算:

异或(xor)?是在Java中是一个位运算符。如果两位一个为0,一个为1,结果为1,否则为0。也就是说

0 ^?0 =?0

0 ^ 1?=?1

1 ^ 1 = 0

1 ^?0 = 1

而异或运算有几个运算法则:

1. 归零律:a ^ a =?0

2. 恒等律:a ^?0 = a

3. 交换律:a ^ b = b ^ a

4. 结合律:a ^ b ^ c = a ^ ( b ^ c ) =?( a ^ b )?^ c

5. 自反:a ^ b ^ a = b

如果到这里还没有看懂,没关系,我们拿上面的数组举例?[ 4, 1, 2, 1, 2 ]

将其进行异或运算得到:4 ^ 1 ^ 2 ^ 1 ^ 2

根据结合律得到:4 ^?( 1 ^ 1) ^ ( 2 ^ 2 )

再根据归零律得到:4 ^ ( 0?^ 0 ) ?= 4 ^ 0

根据恒等率得到结果为:4

结合律就像纯加法一样,无论怎么结合,得到的结果都是一样的。逻辑理清后,现在分析怎么使用代码实现。

  • 因为不知道数组中有多少数据,要获取数组中的数据,需要进行遍历;

  • 可以声明一个int型变量,并初始化值为0;

  • 将获取到的每一个数组中的数据,和这个变量进行异或运算;

  • 最终这个int型的变量就是那个只出现一次的数字

经分析,可以得到代码:

class Solution {
  public int singleNumber(int[] nums) {
?    //?声明一个int型变量,并初始化值为0
    int a = 0;
    for(int i = 0; i < nums.length; i++) {
??????//?假设数组内容为 [ 4, 1, 2, 1, 2 ]
??????//?当i=0时,表达式为?a?=?0?^?4;
??????//?结果为4
??????//?当i=1时,表达式为 a = 4 ^ 1;
??????//?结果为5
??????// 以此类推,最终的结果为4
      a = a ^ nums[i];
    }
    return a;
  }
}

当然,代码还有优化的空间,可以将变量a省掉,可以得到代码:

class Solution {
    public int singleNumber(int[] nums) {
        for(int i = 1; i < nums.length; i++) {
            nums[0] = nums[0] ^ nums[i];
        }
        return nums[0];
    }
}

怎么样?你看懂了吗?

在力扣上提交代码后得到如下结果

图片

图片

该题实现起来是比较简单的,但是能想到使用位运算来解决该问题,还是需要一定的经验和考察能力的。没有想到使用此方法的小伙伴也不要气馁(我也没想到),大家多做多练多看看题解,才能提高自己喔~

图片

题目来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/single-number

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:07:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:18:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码