// 面试题56(二):数组中唯一只出现一次的数字
// 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请
// 找出那个吃出现一次的数字。

#include <iostream>int FindNumberAppearingOnce(int numbers[], int length)
{if (numbers == nullptr || length <= 0)//边界判断throw new std::exception("Invalid input.");int bitSum[32] = { 0 };//开辟一个32长的辅助空间for (int i = 0; i < length; ++i)//对数组的每个数字
    {int bitMask = 1;for (int j = 31; j >= 0; --j)//对每个数字的每一位
        {int bit = numbers[i] & bitMask;//检测numbers[i]的最后一位是0还是1if (bit != 0)//如果为1,bitSum[j]加1,否则不用动bitSum[j] += 1;bitMask = bitMask << 1;//把检测的这个标杆,左移1位,不右移原数据是怕破坏原数据吧
        }}int result = 0;for (int i = 0; i < 32; ++i){result = result << 1;//左移1位,代表乘2result += bitSum[i] % 3;//对每一位取余,重复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);elseprintf("%s FAILED.\n", testName);
}// 所有数字都是正数,唯一的数字是最小的
void Test1()
{int numbers[] = { 1, 1, 2, 2, 2, 1, 3 };int expected = 3;Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
}// 所有数字都是正数,唯一的数字的大小位于中间
void Test2()
{int numbers[] = { 4, 3, 3, 2, 2, 2, 3 };int expected = 4;Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
}// 所有数字都是正数,唯一的数字是最大的
void Test3()
{int numbers[] = { 4, 4, 1, 1, 1, 7, 4 };int expected = 7;Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
}// 唯一的数字是负数
void Test4()
{int numbers[] = { -10, 214, 214, 214 };int expected = -10;Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
}// 除了唯一的数字,其他数字都是负数
void Test5()
{int numbers[] = { -209, 3467, -209, -209 };int expected = 3467;Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
}// 重复的数字有正数也有负数
void Test6()
{int numbers[] = { 1024, -1025, 1024, -1025, 1024, -1025, 1023 };int expected = 1023;Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
}// 所有数字都是负数
void Test7()
{int numbers[] = { -1024, -1024, -1024, -1023 };int expected = -1023;Test("Test7", numbers, sizeof(numbers) / sizeof(int), expected);
}// 唯一的数字是0
void Test8()
{int numbers[] = { -23, 0, 214, -23, 214, -23, 214 };int expected = 0;Test("Test8", numbers, sizeof(numbers) / sizeof(int), expected);
}// 除了唯一的数字,其他数字都是0
void Test9()
{int numbers[] = { 0, 3467, 0, 0, 0, 0, 0, 0 };int expected = 3467;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 0;
}

转载于:https://www.cnblogs.com/CJT-blog/p/10544039.html

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

  1. 牛客网(剑指offer) 第十六题 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. <?php /*class ListNode{var $val;var $next = N ...

  2. 牛客网(剑指offer) 第十四题 链表中倒数第k个节点

    //题目描述:输入一个链表,输出链表该链表中倒数第k个节点. <?php /*class ListNode{var $val;var $next = NULL;function __constr ...

  3. 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...

    题目描述 思路与解析 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长 ...

  4. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  5. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  6. 剑指Offer - 面试题4. 二维数组中的查找(双指针)

    1. 题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例 ...

  7. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  8. 牛客网(剑指offer) 第二十二题 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. <?php/*class TreeNode{var $val;var $left = NULL;var $right = NUL ...

  9. 牛客网(剑指offer) 第十九题 顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  10. 牛客网(剑指offer) 第十八题 二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. <?php/*class TreeNode{var $val;var $left = NULL;var $right = NULL;fun ...

最新文章

  1. 学习笔记:腾讯云--域名解析
  2. System.Timers.Timer 多线程问题[转]
  3. 为什么java单精度要f_为什么快速反平方根如此奇怪和慢Java?
  4. 小米8对一加6打开软件速度测试,买一加6还是小米8?小米8和一加6区别对比
  5. 基于上一篇AS项目依赖库问题的优化解决方案
  6. brew update:以下未跟踪的工作树文件将被合并覆盖:
  7. 【Pycharm IDE】修改字体大小/设置缩略图/设置高亮
  8. 自制jlink ob stm32f072 版本。带串口
  9. lwj_C#_作业 ListT应用
  10. NLTK的安装/对象/词库/分词/词性标注/分块
  11. 【PyCharm 使用指南】之 error running
  12. 计算机主机上有几个按钮,电脑键盘各个按键有哪些作用 电脑键盘各个按键作用介绍...
  13. 第三方支付公司怎么收取手续费
  14. 3600000毫秒等于多少小时_工地扬尘监测规定-多少算超标?
  15. 使用Flashbuilder/Flashbuilder-plugins搭建Flex工程每日构建(自动化构建)的方法
  16. 【华为认证-每日十题】HCNP-RS-IENP(31-40)【问】
  17. 解决wps工作簿从文本中复制粘贴时单元格中首位0无法显示
  18. MTK平台 Android11 支持exFat格式T卡
  19. 梦幻手游服务器维护摆摊公示时间,梦幻手游5月4日维护公告 摆摊交易优化
  20. 用于制作电视广告和音乐视频的计算机,基于BS方式实现视音频编辑的系统及方法专利_专利查询 - 天眼查...

热门文章

  1. free C# Ebook (Amazing amount of ebooks available)
  2. c语言写一元一次函数图像,一元一次函数练习题带答案.doc
  3. python中的append()有什么功能_关于列表:在Python中,“。append()”和“+ = []”之间有什么区别?...
  4. LitJson不支持float
  5. Nginx源码阅读(gdb 调试nginx文件) -- 解析配置文件
  6. [转载]Java多线程——创建线程池的几个核心构造参数
  7. python 自动化发送邮件_干货 | 解放双手,用Python实现自动发送邮件
  8. python setdefault函数_Python字典(Dictionary)setdefault()函数理解
  9. Prototype的JSON支持
  10. XMLHttpRequest的属性