LeetCode136:只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

解题思路:

这里可以使用异或运算。即两个相同的数字异或为0,而0与任何数字异或都是其本身。把数组所有的数都异或,相同的数字异或是为0,那么剩下的就是那个只出现一次的数字。

代码如下:

int test(vector<int> v){int temp=0;for(auto& i:v){temp^=i;}return temp;
}

LeetCode137:只出现一次的数字-Ⅱ

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

解题思路
本题对上述做了一些改进,变成了其余元素出现三次!感觉难了比较多。我们有了第一题的解题思路,可能会先想到也用异或来解决,但是位运算中并没有直接的使得三个相同的数字运算为0的方法!!!

可以遍历所有数,让每个数的二进制的同一位相加,对一个二进制位出现 1的次数对 3取余,若余数为 1,那么我们目标数字的这一位也就是 1.(ps:如果再出个相同数字出现4次的话?方法同理!)

简单的例子,比如

[1,2,2,2] 其转换成二进制就是[01,10,10,10],我们可以知道第一位(从右往左)的二进制总共出现了1次1,那么我们的目标数其二进制在第一位就是1,而相对的第二位出现了3次1,那么我们的目标数的二进制在这一位就不是1。

就这样可以去到得到目标数的二进制的每一位的数字。接着再把其目标数的二进制的每一位的数字进行按位或处理就得得到目标数。

代码如下:

int test(vector<int> v)
{int reslut=0;for(int i=0;i<64;++i)//写64个变量(知道范围的写32位应该也行?)记录每位的二进制1出现的次数{int t =0;for(auto& a:v){t+=(a>>i)&1;  //得到每个数的二进制同一位为1的次数}reslut |=(t%3)<<i;}return reslut;
}

思考:得到二进制的每一位的数字,用按位或处理就可以得到目标数。

用个例子来说明:

一个二进制数 1101,我们可以得到其每一位的数字(其他几位没有的,就用0补上)

第一位:0001

第二位:0000;

第三位:0100;

第四位:1000;

把这四个进行按位或处理(有1为1,所有都是0 为0),所以结果是1101。

【leetcode】只出现一次的数字(位运算)相关推荐

  1. [Leedcode][JAVA][第136题][第137题][只出现一次的数字][位运算][HashSet][HashMap]

    [问题描述][第136,137题][只出现一次的数字] 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了N次.找出那个只出现了一次的元素.[第136题]N= 2 输入: [2,2 ...

  2. 134. Leetcode 136. 只出现一次的数字 (位运算-只出现一次的数字相关题目)

    class Solution:def singleNumber(self, nums: List[int]) -> int:res = 0for i in range(len(nums)):re ...

  3. c语言交换两个数字 位运算_交换两个8位数字| 8086微处理器

    c语言交换两个数字 位运算 Problem statement: 问题陈述: To swap two 8 bits numbers using third register on 8086 micro ...

  4. LeetCode 318. 最大单词长度乘积(位运算)

    1. 题目 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小写字母.如果不存 ...

  5. leetcode 只出现一次的数字

    16 / 16 个通过测试用例 状态:通过 执行用时:12 ms 内存消耗:40.8 MB 提交时间:6 月,3 周之前 class Solution {public int singleNumber ...

  6. LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的字符串数组 words . 每个字符串都只包含 小写英文字母 .words 中任意一个子串中,每个字母都至多只出现一次. 如果通 ...

  7. LeetCode 29. 两数相除(位运算)

    1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...

  8. leetcode 201. Bitwise AND of Numbers Range(位运算,dp)

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  9. leetcode 1310. 子数组异或查询(位运算)

    有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]. 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] ...

  10. LeetCode 1009. 十进制整数的反码(位运算)

    1. 题目 每个非负整数 N 都有其二进制表示.例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推.注意,除 N = ...

最新文章

  1. 计算机自动连续工作的基础是存储程序原理,计算机的存储程序工作原理是什么...
  2. template模板的使用方法
  3. ML之xgboost:利用xgboost算法(自带,特征重要性可视化+且作为阈值训练模型)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
  4. 21.println输出打印.rs
  5. Caffe2:段错误(核心 已转储)
  6. iOS 日期格式的转换
  7. Luckysheet(在线表格) v2.1.12
  8. android 遮罩 进度条,bootstrap创建带遮罩层的进度条
  9. 数据降维之多维缩放MDS(Multiple Dimensional Scaling)
  10. JVM笔记——技术点汇总
  11. 如何给表格数据加顺序号php,通过layui给数据表格添加序号
  12. RetinaFace论文解读 --- RetinaFace: Single-stage Dense Face Localisation in the Wild
  13. php保存pdf旋转90度,怎么将PDF文件向左旋转90度?这款软件还有旋转功能!
  14. B题Tomb Raider ---- 一 。启动emule客户端
  15. info There appears to be trouble with your network connection. Retrying
  16. 通过修复VMware软件解决虚拟机无法识别到U盘设备的问题
  17. 数据增强——基本方法
  18. 阿里云设置密钥对登录服务器
  19. 阿里巴巴Java面试题目
  20. VM虚拟机安装win7系统

热门文章

  1. django 获取环境变量_django 环境变量配置过程详解
  2. 上行和下行是什么意思_为什么无线通信需要同步?
  3. mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?
  4. java怎么设置zip的名词_[Java]对新创建Zip文件的子项设置 压缩/存储 模式
  5. 简单 python 小说爬虫 ultimate
  6. 夯实Java基础(二)——面向对象之封装
  7. px2rem-loader(Vue:移动端自适应,px自动转化)
  8. Spring 静态代理+JDK动态代理和CGLIB动态代理
  9. 2017年给自己定个小目标!
  10. jquery 根据样式或者名称获取 对象遍历赋值