码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【LeetCode每日一题】——136.只出现一次的数字


    文章目录

    • 一【题目类别】
    • 二【题目难度】
    • 三【题目编号】
    • 四【题目描述】
    • 五【题目示例】
    • 六【解题思路】
    • 七【题目提示】
    • 八【时间频度】
    • 九【代码实现】
    • 十【提交结果】

    一【题目类别】

    • 数组

    二【题目难度】

    • 简单

    三【题目编号】

    • 136.只出现一次的数字

    四【题目描述】

    • 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    • 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

    五【题目示例】

    • 示例 1 :

      • 输入:nums = [2,2,1]
      • 输出:1
    • 示例 2 :

      • 输入:nums = [4,1,2,1,2]
      • 输出:4
    • 示例 3 :

      • 输入:nums = [1]
      • 输出:1

    六【解题思路】

    • 这道题如果用哈希表做就很简单了,但是不符合题目要求的时间和空间复杂度
    • 通过这个题可以学习到一个新的知识点:位运算。学过计算机组成原理应该都明白,首先有些性质我们要明白:
      • a ⊕ 0 = a a \oplus0 = a a⊕0=a:任何数和0做异或运算,结果仍然是原来的数
      • a ⊕ a = 0 a \oplus a = 0 a⊕a=0:任何数和其自身做异或运算,结果是0
      • a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a ) = b ⊕ 0 = b a \oplus b \oplus a=b\oplus a\oplus a=b\oplus (a\oplus a)=b\oplus 0 = b a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b:异或运算满足交换律和结合律
    • 通过以上性质就可以在题目要求的时空复杂度下完成此算法
    • 首先定义数字0(res)
    • 然后用0去异或数组的每一个值(从头到尾)
    • 所有重复的数字都被过滤掉了
    • 遍历完后只剩下出现一次的元素
    • 最后返回结果即可

    七【题目提示】

    • 1 < = n u m s . l e n g t h < = 3 ∗ 1 0 4 1 <= nums.length <= 3 * 10^4 1<=nums.length<=3∗104
    • − 3 ∗ 1 0 4 < = n u m s [ i ] < = 3 ∗ 1 0 4 -3 * 10^4 <= nums[i] <= 3 * 10^4 −3∗104<=nums[i]<=3∗104
    • 除 了 某 个 元 素 只 出 现 一 次 以 外 , 其 余 每 个 元 素 均 出 现 两 次 。 除了某个元素只出现一次以外,其余每个元素均出现两次。 除了某个元素只出现一次以外,其余每个元素均出现两次。

    八【时间频度】

    • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为数组长度
    • 空间复杂度: O ( 1 ) O(1) O(1)

    九【代码实现】

    1. Java语言版
    package Array;
    
    /**
     * @Author: IronmanJay
     * @Description: 136.只出现一次的数字
     * @CreateTime: 2022-11-21  09:19
     */
    public class p136_SingleNumber {
    
        public static void main(String[] args) {
            int[] nums = {2, 2, 1};
            int res = singleNumber(nums);
            System.out.println("res = " + res);
        }
    
        public static int singleNumber(int[] nums) {
            int res = 0;
            for (int i = 0; i < nums.length; i++) {
                res ^= nums[i];
            }
            return res;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    1. C语言版
    #include
    
    int singleNumber(int* nums, int numsSize)
    {
    	int res = 0;
    	for (int i = 0; i < numsSize; i++)
    	{
    		res ^= nums[i];
    	}
    	return res;
    }
    
    /*主函数省略*/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    十【提交结果】

    1. Java语言版
      在这里插入图片描述

    2. C语言版
      在这里插入图片描述

  • 相关阅读:
    leetcode做题笔记175. 组合两个表
    目标检测YOLO实战应用案例100讲-基于深度卷积网络的无人机 图像目标检测(续)
    Vue3 第二十四篇:集成vue.draggable
    js保留两位小数不四舍五入
    XAML依赖属性和附加 属性
    【无标题】
    Hadoop中HDFS的API操作、客户端环境准备、配置HADOOP_HOME环境变量
    Autosar MCAL MCU配置时钟-基于cfg
    华为认证HCIA H12-811 Datacom数通考试真题题库【带答案刷题必过】【第一部分】
    【访谈】Eotalk Vol.02:从极客到 CEO,开发者应该如何提升技术领导力?
  • 原文地址:https://blog.csdn.net/IronmanJay/article/details/127957689
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号