// 面试题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 ;
}

最新文章

  1. jquery为新增元素添加事件
  2. javaScript怪癖分析
  3. js,html,css注释大集合
  4. html5 (个人笔记)
  5. java中类名.class、实例.getclass()区别
  6. 查看Linux系统版本信息
  7. FPGA中如何实现除法?
  8. ThinkPHP运算符与PHP运算符对照表
  9. ASP.NET(C#)中的try catch异常处理机制
  10. xcode 6.4模拟器出现多个相同版本:OSX Yosemite 上安装xcode7 beta和xcode6.4
  11. WebService-使用JDK开发WebService
  12. 自学spring过程中碰到的问题list,一个一个解决
  13. Haskell复习笔记(二)
  14. json对象组按某个字段排序
  15. 穷举法、for循环、函数、作用域、斐波那契数
  16. MDX 查询原型
  17. JSON平铺功能的实现(JS操作JSON数据)
  18. vue双向绑定(数据劫持+发布者-订阅者模式)
  19. ui-router ng-router
  20. spring的配置文件解析(转)

热门文章

  1. ==和equasl、hashmap原理(***)
  2. JavaScript笔记 #05# 用Regex辅助生成文章目录
  3. com.mchange.v2.c3p0.impl.NewPooledConnection@be1839d closed by a client的正确解答
  4. 前端基础小标签3 H5新标签
  5. 【python39--面向对象组合】
  6. DOM元素加载之前执行的jQuery代码
  7. SVM学习笔记2-拉格朗日对偶
  8. ODAC(V9.5.15) 学习笔记(十四)TCRBatchMove
  9. bzoj 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场 最小点覆盖
  10. 数据库03_SQL语句