数组中数字出现的次数(中等难度)

简介: 数组中数字出现的次数(中等难度)

目录

题目概述(中等难度)

思路与代码

思路展现

代码示例

题目概述(中等难度)

2.png


题目链接:

点我进入leetcode


思路与代码

思路展现

首先这道题目用到了原码,反码,补码的知识,有需要的小伙伴来看下这篇博客温习一下:


点我进入博客

题解可以看这个:

点我进入题解

那么先来看代码,然后我再对题解做一下补充


代码示例

class Solution {
   public int[] singleNumbers(int[] nums) {
    int bitmask = 0;
    //把数组中的所有元素全部都异或一遍
    for (int num : nums) {
        bitmask ^= num;
    }
    //因为异或运算的结果不一定都是2的n次幂,
    //在二进制中可能会有多个1,为了方便计算
    //我们只需保留其中的任何一个1,其他的都
    //让他变为0,这里保留的是最右边的1
    bitmask &= -bitmask;
    int[] rets = {0, 0};
    for (int num : nums) {
        //然后再把数组分为两部分,每部分在
        //分别异或
        if ((num & bitmask) == 0) {
            rets[0] ^= num;
        } else {
            rets[1] ^= num;
        }
    }
    return rets;
  }
}

时间复杂度:O(N)

空间复杂度:O(1)

解析

for (int num : nums) {
        bitmask ^= num;
    }

这里就是将所有数字异或后,一定是只剩下最后两个只出现一次的数字,例如题解中给出的这组数字:[12,13,14,17,14,12],

其中当将这组数组中的每个数字都异或完毕后,只剩下13^17,其异或后的结果为00000000 00000000 00000000 00011100,而我们代码中有一段是 bitmask &= -bitmask,所以说此时bitmask等于00000000 00000000 00000000 00011100,即为28,那么(-28)怎么算呢?注意:补码就是负数在计算机中的二进制表示方法,此时-28的原码为10000000 00000000 00000000 00011100,反码为11111111 11111111 11111111 11100011,那么补码为11111111 11111111 11111111 11100100,那么-bitmask = 11111111 11111111 11111111 11100100,而bitmask &= -bitmask即为下图所示:

2.png

可以看到此时bitmask的值为00000000 00000000 00000000 00000100,

可以看到我们最后一个1被保留住了,那么此时我们原数组就可以分为两组,一个是与此时的bitmask 与(&)后的结果为0的为一组,不为0的为一组(其实这块结果为不为0的原因跟每个数组中的数字的二进制转换后的倒数第三个数字是否为1还是0有关,为0的话就是0,为1的话就是非0,大家可以自己验证下)

所以说最后13和17一定再不同的组,然后12和14各自一定都在同一个组,12 ^ 12 = 0,14 ^ 14 = 0,所以数组中各自也只剩下了13和17,然后返回这个数组即可.


相关文章
|
SQL 存储 关系型数据库
MySQL not exists 真的不走索引么
MySQL not exists 真的不走索引么
516 0
|
存储 NoSQL BI
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
337 0
阿里巴巴发布《城市数字孪生能力平台总体技术要求》企业标准, 促进数字孪生互联互通生态建设
2023年3月21日,阿里巴巴集团举办城市数字孪生企业标准发布及研讨会,发布了《城市数字孪生能力平台总体技术要求》企业标准。
阿里巴巴发布《城市数字孪生能力平台总体技术要求》企业标准, 促进数字孪生互联互通生态建设
|
9月前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
296 0
|
测试技术
详解单元测试问题之@InjectMocks注入mock对象如何解决
详解单元测试问题之@InjectMocks注入mock对象如何解决
1121 1
|
存储 监控 供应链
账单系统-架构设计思路(对外版)
阿里商旅背景阿里商旅作为飞猪旅行旗下面向企业客户的数字化差旅解决方案产品,依托飞猪旅行机票、酒店供应链,为企业客户提供一站式的机票、酒店、火车票、用车等预订管控及结算票据服务。阿里商旅不仅是集团欢行的供应商,而且近几年在商业化差旅市场上崭露头角,服务了2万+中大型客户,43万+小微企业。FY22财年商旅技术团队重点规划在酒店供应链、预订管控服务、B+C客户服务、渠道及商旅基础建设等核心方向进行建设
5333 2
账单系统-架构设计思路(对外版)
|
数据采集 数据可视化 数据挖掘
使用Numpy进行高效的Python爬虫数据处理
使用Numpy进行高效的Python爬虫数据处理
|
数据采集 存储 供应链
数据对账的目的是什么?
数据对账的目的是什么?
644 2
Visual paradigm社区版下载及中文菜单的设置
Visual paradigm社区版下载及中文菜单的设置
706 0
【攻防世界】easyphp(PHP代码审计)
【攻防世界】easyphp(PHP代码审计)