// 面试题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. 框架frame

    使用框架切分网页 效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  2. Web视频播放之video.js

    h5这么火是有它的理由的,支持原生视频播放,但是目前兼容性还不是很好,因此使用js框架支持网站视频播放是比较不错的选择. 下载video.js,我们可以通过官网去下,但是官网在国外,我尝试了几次均下载 ...

  3. win7搭建pyqt4开发环境

    版本 win7 64bit python2.7 https://www.python.org/ftp/python/2.7.13/python-2.7.13.amd64.msi pyqt4 https ...

  4. Redis热点Key发现及常见解决方案!

    一.热点Key问题产生的原因 1.用户消费的数据远大于生产的数据(热卖商品.热点新闻.热点评论.明星直播). 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的降价促销,当这其中的某一件 ...

  5. shell脚本一键安装redis集群[最终版]

    直接上shell了. #!/bin/bash #---------------------------------------------------------------------------- ...

  6. Codeforces 917F Substrings in a String - 后缀自动机 - 分块 - bitset - KMP

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字母串,要求支持以下操作: 修改一个位置的字母 查询一段区间中,字符串$s$作为子串出现的次数 Solution 1 Bitset 每 ...

  7. Eclipse中一个项目调用另一个项目的资源

    如果一个项目A想要引用另一个项目B的资源的话,按照一下步骤进行设置: 右键点击项目A---->>>Build Path--->>>Configure Build P ...

  8. topcoder srm list

    300 305 310 315 320 325 330 335 340 350 360 370 380 390 400 410 415 420 425 430 435 440 445 450 455 ...

  9. POJ 2018 Best Cow Fences(二分最大区间平均数)题解

    题意:给出长度>=f的最大连续区间平均数 思路:二分这个平均数,然后O(n)判断是否可行,再调整l,r.判断方法是,先求出每个数对这个平均数的贡献,再求出长度>=f的最大贡献的区间,如果这 ...

  10. 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp

    题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...