// 面试题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. openvpn server setup

    Set Up an OpenVPN Server client access 内部环境搭建

  2. 闭包引起的onclick不起作用

    问题描述:在html页面绑定onclick="cli()" 方法,定义在$(function( function cli(){} ))不起作用 $(function(){ func ...

  3. 计算多数的乘积(Python实现)

    1 # -*- coding: utf-8 -*- # sum_of_products.py # @author 0yst3r # @description 两数之积及多数之积 # @created ...

  4. Codeforces 868D Huge Strings - 位运算 - 暴力

    You are given n strings s1, s2, ..., sn consisting of characters 0 and 1. m operations are performed ...

  5. C语言实现随机生成0~100的数

    #include <iostream> #include <time.h> int main() { srand((unsigned)time(NULL));//srand() ...

  6. 2018年11月20日 远交近攻 list1

    list 列表用法 li=[1,2,3,"abc"] #列表中的元素,可以为数字或者字符串或者布尔值或者就是列表等,所有都能放进去 #列表中也能嵌套列表 pi=[1,2,3,[2, ...

  7. Flutter的脚手架(Scaffold)

  8. windows下如何安装vundle?

    参考: http://blog.csdn.net/zhuxiaoyang2000/article/details/8636472 vundle是gmarik 受 ruby的 bunler的启发开发的. ...

  9. C# 中2个问号的作用。C#的??代表是什么意思

    https://www.cnblogs.com/gggg/p/5867412.html 变量定义中含有一个问号,意思是这个数据类型是NullAble类型的.(NullAble意思是可以为空) 变量定义 ...

  10. (转)Awsome Domain-Adaptation

    Awsome Domain-Adaptation 2018-08-06 19:27:54 This blog is copied from: https://github.com/zhaoxin94/ ...