《剑指offer》第五十六题(数组中只出现一次的两个数字)
- // 面试题56(一):数组中只出现一次的两个数字
- // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序
- // 找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
- #include <iostream>
- unsigned int FindFirstBitIs1(int num);
- bool IsBit1(int num, unsigned int indexBit);
- void FindNumsAppearOnce(int data[], int length, int* num1, int* num2)
- {
- if (data == nullptr || length < )//判断边界
- return;
- int resultExclusiveOR = ;
- for (int i = ; i < length; ++i)//讲究,0异或任何一个数就等于那个数,三个数连续异或,若两个一样的,会抵消,剩下的值就是第三个数
- resultExclusiveOR ^= data[i];
- unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);//求出这组数里,某位为1
- *num1 = *num2 = ;
- for (int j = ; j < length; ++j)//以此位为标志,分为两个数组,每个数组都有且只有一个数字,其个数为奇数
- {
- if (IsBit1(data[j], indexOf1))
- *num1 ^= data[j];
- else
- *num2 ^= data[j];
- }
- }
- // 找到num从右边数起第一个是1的位
- unsigned int FindFirstBitIs1(int num)
- {
- int indexBit = ;
- while (((num & ) == ) && (indexBit < * sizeof(int)))
- {
- num = num >> ;//向右移1位
- ++indexBit;
- }
- return indexBit;
- }
- // 判断数字num的第indexBit位是不是1
- bool IsBit1(int num, unsigned int indexBit)
- {
- num = num >> indexBit;
- return (num & );
- }
- // ====================测试代码====================
- void Test(const char* testName, int data[], int length, int expected1, int expected2)
- {
- if (testName != nullptr)
- printf("%s begins: ", testName);
- int result1, result2;
- FindNumsAppearOnce(data, length, &result1, &result2);
- if ((expected1 == result1 && expected2 == result2) ||
- (expected2 == result1 && expected1 == result2))
- printf("Passed.\n\n");
- else
- printf("Failed.\n\n");
- }
- void Test1()
- {
- int data[] = { , , , , , , , };
- Test("Test1", data, sizeof(data) / sizeof(int), , );
- }
- void Test2()
- {
- int data[] = { , };
- Test("Test2", data, sizeof(data) / sizeof(int), , );
- }
- void Test3()
- {
- int data[] = { , , , , , };
- Test("Test3", data, sizeof(data) / sizeof(int), , );
- }
- int main(int argc, char* argv[])
- {
- Test1();
- Test2();
- Test3();
- system("pause");
- return ;
- }
《剑指offer》第五十六题(数组中只出现一次的两个数字)的更多相关文章
- 《剑指offer》第二十六题(树的子结构)
// 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...
- 《剑指offer》第十六题(数值的整数次方)
// 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...
- 【剑指offer】面试题40:数组中只出现一次的数字
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...
- (剑指Offer)面试题40:数组中只出现一次的数字
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 这道题的简单版本是除了一个数字之外,其他数字都出现了两次,这个很简单,将所有的数异或一遍就 ...
- 剑指Offer(二十六):二叉搜索树与双向链表
剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 《剑指Offer》面试题-二维数组中的查找
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
随机推荐
- fjwc2019 D2T1 直径 (构造)
#181. 「2019冬令营提高组」直径 (这题构造题是我考场上唯一一A的题........) 先看这个特殊的Subtask4 Subtask 4(20pts):$\sqrt{1+8k}$ 为整 ...
- linux检查系统CPU,内存,磁盘使用率
#!/bin/bash CPU=`top -bn 1 -i -c | sed -n '3p' | awk -F ':' '{print$2}' | awk '{print$1}'` MEM=`free ...
- Linux基础笔记——RAID
关于RAID RAID0:理论上来说一个有n块磁盘组成的raid0,它的读写是单个磁盘性能的n倍,具有低成本,高性能,低安全性,可用于可靠性不高的应用,如:视频.音频.临时数据存储等 RAID1:也称 ...
- undefined reference to `vtable for MyColor'
MyColor是新建的类,原因是使用了QObject,但是系统没有反应过来 解决:从工程删除,再添加进去[QtCreator]
- Spring 学习——Spring JSR注解——@Resoure、@PostConstruct、@PreDestroy、@Inject、@Named
JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正 ...
- if语句学习
#print("您好,我叫周星驰") ''' x=1+2+3 print(x*4) print(x**x) a=input("请输入相应的数字a") a=int ...
- makefile基本操作
多数内容copy自youtube的一个视频:https://www.youtube.com/watch?v=E1_uuFWibuM 执行环境:原作者是在Linux下做的视频,而我使用的是win10,w ...
- apache安装时的一些术语
apache源码安装时,需要的哪些必须依赖模块? 主要需要apr, apr-util, pcre模块 其中 apr模块时必须的. 如何卸载 源码安装的软件? 在源码 的 解压目录下, 使用 make ...
- SpringBoot 统一异常处理
统一异常处理: @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactor ...
- Linux/shell: remove adjacent similar patterns
cat > temp004AA1abcAA2AA3abcAA4abcAA5AA6 awk 'BEGIN {pre=0; str="";} { if(NR==1){ i ...