// 面试题56(二):数组中唯一只出现一次的数字
// 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请
// 找出那个吃出现一次的数字。 #include <iostream> int FindNumberAppearingOnce(int numbers[], int length)
{
if (numbers == nullptr || length <= )//边界判断
throw new std::exception("Invalid input."); int bitSum[] = { };//开辟一个32长的辅助空间
for (int i = ; i < length; ++i)//对数组的每个数字
{
int bitMask = ;
for (int j = ; j >= ; --j)//对每个数字的每一位
{
int bit = numbers[i] & bitMask;//检测numbers[i]的最后一位是0还是1
if (bit != )//如果为1,bitSum[j]加1,否则不用动
bitSum[j] += ; bitMask = bitMask << ;//把检测的这个标杆,左移1位,不右移原数据是怕破坏原数据吧
}
} int result = ;
for (int i = ; i < ; ++i)
{
result = result << ;//左移1位,代表乘2
result += bitSum[i] % ;//对每一位取余,重复3个的数字都会滤掉,并和之前计算的相加
} return result;
} // ====================测试代码====================
void Test(const char* testName, int numbers[], int length, int expected)
{
int result = FindNumberAppearingOnce(numbers, length);
if (result == expected)
printf("%s passed.\n", testName);
else
printf("%s FAILED.\n", testName);
} // 所有数字都是正数,唯一的数字是最小的
void Test1()
{
int numbers[] = { , , , , , , };
int expected = ;
Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
} // 所有数字都是正数,唯一的数字的大小位于中间
void Test2()
{
int numbers[] = { , , , , , , };
int expected = ;
Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
} // 所有数字都是正数,唯一的数字是最大的
void Test3()
{
int numbers[] = { , , , , , , };
int expected = ;
Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
} // 唯一的数字是负数
void Test4()
{
int numbers[] = { -, , , };
int expected = -;
Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
} // 除了唯一的数字,其他数字都是负数
void Test5()
{
int numbers[] = { -, , -, - };
int expected = ;
Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
} // 重复的数字有正数也有负数
void Test6()
{
int numbers[] = { , -, , -, , -, };
int expected = ;
Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
} // 所有数字都是负数
void Test7()
{
int numbers[] = { -, -, -, - };
int expected = -;
Test("Test7", numbers, sizeof(numbers) / sizeof(int), expected);
} // 唯一的数字是0
void Test8()
{
int numbers[] = { -, , , -, , -, };
int expected = ;
Test("Test8", numbers, sizeof(numbers) / sizeof(int), expected);
} // 除了唯一的数字,其他数字都是0
void Test9()
{
int numbers[] = { , , , , , , , };
int expected = ;
Test("Test9", numbers, sizeof(numbers) / sizeof(int), expected);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
system("pause");
return ;
}

《剑指offer》第五十六题(数组中唯一只出现一次的数字)的更多相关文章

  1. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  2. 《剑指offer》第十六题(数值的整数次方)

    // 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...

  3. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  4. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  5. 剑指Offer(三十四):第一个只出现一次的字符

    剑指Offer(三十四):第一个只出现一次的字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  6. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  7. 《剑指Offer》面试题-二维数组中的查找

    题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...

  8. 剑指offer【01】- 二维数组中的查找(Java)

    在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  10. 【Java】 剑指offer(56-2) 数组中唯一只出现一次的数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次. ...

随机推荐

  1. LSTM算法原理理解

    神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...

  2. php操作共享内存shmop类及简单使用测试(代码)

    SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段.在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码.可以使用 3 ...

  3. P1357 花园

    洛咕原题 题解 状压dp+矩乘 首先看到题目说M<=5,这么小的数据明显可以用状压保存相邻状态,于是可以得到一个80分的dp: 先筛出所有可用的状态,然后建立一个矩阵保存可转移的状态,再然后把每 ...

  4. Java排序之升序与降序

    以前在学校学排序的时候,总是自己写排序的代码,真正到工作中,直接使用java提供的排序方法,但最近发现行业默认的和学习时有些不一样. 以前总是在进行排序时如果前边的数字和后边数字的差为负则交换两个数字 ...

  5. maven-shade-plugin插件

    maven-shade-plugin主要是maven-assembly-plugin的后继者,用来将一个自启动jar项目的依赖打包到一个大的jar中,比如dubbo就是这么做的.具体可参考http:/ ...

  6. 关于actor模型

    actor model是1973年就提出的一个分布式并发编程模型,在erlang语言中得到广泛支持和应用.目前Java中也出现了很多支持actor模型的库:akka.killim.jetlang等等, ...

  7. SqlBulkCopy类(将一个表插入到数据库)

    利用SqlBulkCopy类一次插入多条数据,即将一个表直接插入数据库. 首先,新建一个表,要保证表中的列名与数据库表的字段保持一致. 如果数据库一张TableMenuRole表,ID自增,MenuI ...

  8. DNS 基础

    DNS Domain Name System:域名系统,主要用来将域名解析为IP.DNS以及相关系统存在,主要有两个原因: 可以让人容易记住名字,而不是记住IP: 它允许服务器改变IP,但是采用同样的 ...

  9. LightOJ 1027 A Dangerous Maze(期望)题解

    题意:n扇门,每扇门后都有一个值x,如果x<0会让你等待-x再重新回到这里选择门,x>0你经过x时间就会被传送走,问你被传送走的期望 思路:假设被传送走的期望为E,那么对于x<0来说 ...

  10. android 控件获取 获取焦点

    控件.setEnabled(true);控件.setFocusable(true);控件.setFocusableInTouchMode(true);控件.requestFocus();控件.requ ...