编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.用类实现一维数组
  • 02.从数组中删除重复项
  • 03.啤酒与饮料
  • 04.二维数组中查找
  • 05.数组中重复的数字
  • 06.和为s的两个数字
  • 07.数组中只出现一次数字
  • 08.数组中只出现一次的数字
  • 09.买卖股票最佳时机
  • 10.调整数组顺序
  • 11.找出常用的数字
  • 12.旋转数组的最小数字
  • 13.调整数组顺序使奇数位于偶数前面
  • 14.顺时针打印矩阵
  • 15.数组中出现次数超过一半的数字
  • 16.最小的k个数
  • 17.连续子数组的最大和
  • 18.把数组排成最小的数
  • 19.数组中的逆序对
  • 20.在排序数组中出现的次数
  • 21.滑动窗口的最大值

08.数组中只出现一次的数字

目录介绍

  • 01.题目要求
  • 02.问题分析
  • 03.实例代码

01.题目要求

  • 问题如下所示:
    • 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    • 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

02.问题分析

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

03.实例代码

  • 如下所示
    /**
     * 我能想到的第一个方法就是把所有的值当成 Map 的key,出现的次数当成value
     * 最后次数为 1 的就是那个单个的
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (!map.containsKey(num)) {
                map.put(num, 1);
            } else {
                map.put(num, map.get(num) + 1);
            }
        }
        return map.entrySet().stream().filter(r -> r.getValue() == 1).findFirst().get().getKey();
    }
    
    /**
     * 看到重复元素,本能的想到 Set,可以考虑把出现两次的数字先添加到 Set 里面,然后再移除掉,
     * 最后剩下一个就是单个的值。
     */
    public int singleNumber1(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (!set.remove(num)) {
                set.add(num);
            }
        }
        return set.iterator().next();
    }
    
    /**
     * 异或(^) 运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
     * 除了其中一个数字是一次外,其他的都是两次,相同的值异或结果为0,用0异或所有的值,
     * 最终结果就是那个单个的值。
     */
    public int singleNumber2(int[] nums) {
        int r = 0;
        for (int num : nums) {
            r ^= num;
        }
        return r;
    }
贡献者: yangchong211
上一篇
07.数组中只出现一次数字
下一篇
09.买卖股票最佳时机