二进制位方法
集合的每个元素,都有可以选或不选,用二进制的位来表示,0表示不选,1表示选自。0x1 << nums.size()-1 的每一位就代表了集合中每个元素都选用。这里由于集合中每个元素都不相同,所以可以用二进制位唯一地表示它们。每次循环遍历该数的每位bit的状态可以判别是否加入其所表示的元素。
递归回溯的方法见:https://blog.csdn.net/asmartkiller/article/details/96313489


哈希表法:元素没有在哈希表中出现时,则加入哈希表,否则,将该元素从哈希表中删除,但是由于题目空间要求限制,故哈希表法不适用。
异或法:

我们只需要将所有的数进行 XOR 操作,得到那个唯一的数字。

https://blog.csdn.net/jiangxiewei/article/details/82227451


这里最重要讲的是三进制法,是沿袭上一题的思路进行的。需要实现无进位的三进制计数器:使用ba来记录bit为1的数量(00->01->10->00)。从下图可以看到低位 a = (~b)&(~a)&(num) + (~b)&(a)&(~num)也就是a = (a^num) & ~b。但是注意的是因为这行更新了a的状态,高位b的表达式需要依赖于更新了的a,所以当b=1时,a都是为0的。故b的表达式为b = (b^num) & ~a

b a num 更新后b 更新后a
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 1 0
1 0 1 0 0

更通用的解法:这个题其实就是求,在其他数都出现k次的数组中有一个数只出现一次,求出这个数。使用一个32维的数组,用这个32维的数组存储所有数里面第0位1的总数,第1位1的总数。。。第31位1的总数。假如第0位1的个数是k的倍数,那么要求的这个数在该位一定是0,若不是k的倍数,那么要求的这个数在该位一定是1,第1位的1一直到第31位的1的个数同理。为什么呢?因为假如说数组中的某些数在该位置是1,那么因为这个数要么出现k次,那么出现1次。


哈希法

巧用数字的不同
第一步: 把所有的元素进行异或操作,最终得到一个异或值。因为是不同的两个数字,所以这个值必定不为0;
第二步: 取异或值最后一个二进制位为1的数字作为mask,如果是1则表示两个数字在这一位上不同。
第三步: 通过与这个mask进行与操作,如果为0的分为一个数组,为1的分为另一个数组。这两个出现一次的不同的数被分在两个不同的数组。这样就把问题降低成了:“有一个数组每个数字都出现两次,有一个数字只出现了一次,求出该数字”。对这两个子问题分别进行全异或就可以得到两个解。也就是最终的数组了。


Boyer-Moore 投票算法:如果我们把众数记为 +1 ,把其他数记为−1 ,将它们全部加起来,显然和大于 0 ,从结果本身我们可以看出众数比其他数多。本质上, Boyer-Moore 算法就是找 nums 的一个后缀 suf ,其中 suf[0] 就是后缀中的众数。我们维护一个计数器,如果遇到一个我们目前的候选众数,就将计数器加一,否则减一。只要计数器等于 0 ,我们就将 nums 中之前访问的数字全部 忘记 ,并把下一个数字当做候选的众数。
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
首先,下标为 0 的 7 被当做众数的第一个候选。在下标为 5 处,计数器会变回0 。所以下标为 6 的 5 是下一个众数的候选者。由于这个例子中 7 是真正的众数,所以通过忽略掉前面的数字,我们忽略掉了同样多数目的众数和非众数。因此, 7 仍然是剩下数字中的众数。
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]
现在,众数是 5 (在计数器归零的时候我们把候选从 7 变成了 5)。此时,我们的候选者并不是真正的众数,但是我们在 遗忘 前面的数字的时候,要去掉相同数目的众数和非众数(如果遗忘更多的非众数,会导致计数器变成负数)。因此,上面的过程说明了我们可以放心地遗忘前面的数字,并继续求解剩下数字中的众数。最后,总有一个后缀满足计数器是大于 0 的,此时这个后缀的众数就是整个数组的众数。


官方题解给的小trick:

int res = 0;while(n != 0){//将n 和 n−1 做与运算,会把最后一个 1 的位变成 0n = n & (n-1);res++;}return res;

不断把数字最后一个 1 反转,并把答案加一。当数字变成 0 的时候,我们就知道它没有 1 的位了,此时返回答案。这里关键的想法是对于任意数字 n ,将 n 和 n - 1 做与运算,会把最后一个 1 的位变成 0 。

在二进制表示中,数字 n 中最低位的 1 总是对应n−1 中的 0 。因此,将 n 和 n−1 与运算总是能把 n 中最低位的 1 变成 0 ,并保持其他位不变。


数字范围按位与利用了上面题目的技巧:如果m是n-1,从数字的二进制表示上可以发现n&m的结果是n的最后一个为1的bit被抹去的结果。也就是如果m处于n&(n-1) <= m <n中,[m,n]之间数的与运算结果即为n的最后一个为1的bit被抹去的结果。算法只要每次判断如果n>m,则说明n的最后一个为1的bit将不会出现。

位运算相关题目-一些小trick 1bit代表独立数字 求只出现一次的数字 无进位n进制数 n(-n) Boyer-Moore 投票算法 n(n-1)相关推荐

  1. 16位转10位c语言,10进制数转换为16位二进制数

    写在前面: 题解是对具体题目的编程实现,不会具体讲解C语言语法.请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~).在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以 ...

  2. 百家姓128进制数的除法运算

    百家姓128进制数的除法运算 如何进行百家姓128进制数的除法运算呢?可以通过模仿除法的竖式算法来实现. 1.先将百家姓128进制的被除数和除数,用其权重替代中文码. 2.比较被除数和除数的大小,如果 ...

  3. 汇编-输入8位二进制串并转换为16进制数显示到屏幕(利用8421转换)

    今天编写了一个 输入二进制串并转换为16进制数显示到屏幕 的汇编程序 在编写过程中遇到一些问题,并解决后,想把它与大家分享. 题目是这样的: 分析题目: 可得要求 输入 11111111 得到 00F ...

  4. 将一个10进制数转化为任意进制数 猜拳小游戏

    1.如何将一个10进制数,转化为2~16进制之间的数.且当数字>=10时,输出相对应的字母A~F 2.制作一个猜拳的小游戏 一.10进制转化为任意进制 1.首先知道进制的转化规则------可参 ...

  5. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  6. java16进制取前几位_16位16进制数怎么取前8位和后8位

    展开全部 我用C语言来回答这个问题.16位就是一个2字节整636f707962616964757a686964616f31333433633530数. unsigned short hex=0x123 ...

  7. 我替一位仁兄改的n进制数相加的问题

    下面是我替一位仁兄改的n进制数相加的问题的程序,保存下来也供以后自己参考. 如果哪位仁兄觉得有不恰之处,欢迎赐教! #include <stdio.h> #include <stdl ...

  8. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  9. java 中 10进制 转为 4位 或者8位 16进制数

    int i =789; //输出为16进制数 Integer.toHexString(), String s=Integer.toHexString(Integer.valueOf(value)); ...

最新文章

  1. SpringBoot日期格式处理
  2. 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
  3. 只有mdf文件的恢复技术
  4. 【kafka】控制台默认不能发送大数据 4096 4095 4129
  5. python读写excel模块pandas_如何用python pandas操作excel?
  6. SQL注入学习part05:(结合sqli-libs学习:41-50关)
  7. 《AlwaysRun!》第五次作业:项目需求分析改进与系统设计
  8. [SQL提数]函数的灵活使用
  9. C++内存布局(1)-让new出的两个变量在堆上的地址连续
  10. python数据分析 - 卡方检验
  11. freyja最重要的一个功能完成
  12. Yann Martell《少年 pi 的奇幻漂流》
  13. 联网获取360数据,识别骚扰电话,java实现
  14. 高清碑文《怀仁集王羲之书圣教序》
  15. python openssl 证书加解密过程感觉是这样
  16. 阿里云主机安全规则设置后端口依然不起作用的问题
  17. [译] 讨论 JS ⚡:文档
  18. [学习笔记] BearPi-HM Nano - 开发板介绍
  19. 说出ArrayList,Vector,nbsp;Linke…
  20. 【Neo4j构建知识图谱】Python调用cypher语言(1):只需5行代码一次性完成节点、关系、属性的创建

热门文章

  1. 乌合之众-大众心理研究(五)
  2. 笔记 ~ 第三章 - 3.2 数据查询
  3. Qt5 模拟鼠标点击
  4. Hbase-2.0.5
  5. 8 Babylonjs基础入门 相机,模型碰撞和重力效果
  6. 2022年亚太杯数学建模竞赛ABC题
  7. 微信公众号教程(10)公众账号自定义回复功能
  8. 小米手机:雷布斯的米饭刚下锅
  9. 景点接口 查询携程旅游门票景点详情
  10. Unity Shader 之 简单实现物体被压扁(top顶点的逐渐与bottom顶点重合)的效果