1. // 面试题3(一):找出数组中重复的数字
  2. // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
  3. // 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
  4. // 那么对应的输出是重复的数字2或者3。
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. bool duplicate(int* numbers,int length,int& num)
  10. {
  11. if (numbers == NULL || length <= )//判断输入是否对
  12. return false;
  13.  
  14. for (int i = ; i < length; i++)//判断是否满足题目条件
  15. {
  16. if (numbers[i] < || numbers[i] >= length)
  17. return false;
  18. }
  19.  
  20. for (int i = ; i < length; i++)//核心思想:轮流找自己位置,如果那个位置是你,那你就是重复的
  21. {
  22. while (numbers[i] != i)
  23. {
  24. if (numbers[i] == numbers[numbers[i]])
  25. {
  26. num = numbers[i];
  27. return true;
  28. }
  29. int temp = numbers[i];
  30. numbers[i] = numbers[temp];
  31. numbers[temp] = temp;
  32. }
  33. }
  34. return false;
  35. }
  36.  
  37. // ====================测试代码====================
  38. bool contains(int array[], int length, int number)
  39. {
  40. for (int i = ; i < length; ++i)
  41. {
  42. if (array[i] == number)
  43. return true;
  44. }
  45.  
  46. return false;
  47. }
  48.  
  49. void test(const char* testName, int numbers[], int lengthNumbers, int expected[], int expectedExpected, bool validArgument)
  50. {
  51. printf("%s begins: ", testName);
  52.  
  53. int duplication;
  54. bool validInput = duplicate(numbers, lengthNumbers, duplication);
  55.  
  56. if (validArgument == validInput)
  57. {
  58. if (validArgument)
  59. {
  60. if (contains(expected, expectedExpected, duplication))
  61. printf("Passed.\n");
  62. else
  63. printf("FAILED.\n");
  64. }
  65. else
  66. printf("Passed.\n");
  67. }
  68. else
  69. printf("FAILED.\n");
  70. }
  71.  
  72. // 重复的数字是数组中最小的数字
  73. void test1()
  74. {
  75. int numbers[] = { , , , , };
  76. int duplications[] = { };
  77. test("Test1", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
  78. }
  79.  
  80. // 重复的数字是数组中最大的数字
  81. void test2()
  82. {
  83. int numbers[] = { , , , , };
  84. int duplications[] = { };
  85. test("Test2", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
  86. }
  87.  
  88. // 数组中存在多个重复的数字
  89. void test3()
  90. {
  91. int numbers[] = { , , , , };
  92. int duplications[] = { , };
  93. test("Test3", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
  94. }
  95.  
  96. // 没有重复的数字
  97. void test4()
  98. {
  99. int numbers[] = { , , , , };
  100. int duplications[] = { - }; // not in use in the test function
  101. test("Test4", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
  102. }
  103.  
  104. // 没有重复的数字
  105. void test5()
  106. {
  107. int numbers[] = { , , , , };
  108. int duplications[] = { - }; // not in use in the test function
  109. test("Test5", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
  110. }
  111.  
  112. // 无效的输入
  113. void test6()
  114. {
  115. int* numbers = nullptr;
  116. int duplications[] = { - }; // not in use in the test function
  117. test("Test6", numbers, , duplications, sizeof(duplications) / sizeof(int), false);
  118. }
  119.  
  120. void main()
  121. {
  122. test1();
  123. test2();
  124. test3();
  125. test4();
  126. test5();
  127. test6();
  128.  
  129. system("pause");
  130. }
  131.  
  132. //这个代码写的我很难受
  133. //首先是子函数duplicate(),写的时候错了很多地方,比如括号位置,return等等,应该还是不熟练
  134. //其次是人家写的测试代码,我的天,真是,写的太细了
  135. //关注sizeof(numbers) / sizeof(int)

《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)的更多相关文章

  1. 《剑指offer》第十八题(删除链表中重复的结点)

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  2. 剑指offer——python【第54题】字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  3. 【剑指offer】面试题68(补充) 0到n-1中缺失的数字(二分法的进一步应用)

    题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内. 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 输出 输入:[0,1,2, ...

  4. 剑指offer——python【第56题】删除链表中的重复节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  5. 《剑指offer》第五十题(字符流中第一个只出现一次的字符)

    // 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从 // 字符流中只读出前两个字符"go"时,第一 ...

  6. 《剑指offer》面试题53 - II. 0~n-1中缺失的数字

    问题描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [ ...

  7. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  8. 剑指Offer(三十七):数字在排序数组中出现的次数

    剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

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

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

  10. 剑指Offer(三十五):数组中的逆序对

    剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

随机推荐

  1. 微信小程序-1

    微信小程序 (开发微信小程序基础:HTML+js+css) l  准备工作 工具安装 开发工具是由微信官方提供 项目的预览(校验环境) l  开发体验阶段 -         Hello world ...

  2. Docker深入浅出2

    Docker系统架构 Docker使用客户端-服务端(c/s)架构模式,使用远程api来管理和创建Docker容器. docker容器通过Docker镜像来创建. 容器与镜像的关系类似于面向对象编程中 ...

  3. cordova+Android Studio 1.0+ionic+win7(转)

    转自http://blog.csdn.net/fuyunww/article/details/42216125 目录(?)[-] 在项目目录下执行 a创建工程 b添加平台支持 c添加插件在Androi ...

  4. 002-ubuntu安装

    一.安装了ubuntu desktop版本后: 1.进行桥接联网. 2.运行更新:#sudo apt-get update. 3.安装net-tools网络工具包:#sudo apt install ...

  5. ASP.NET控件--DropDownList

      设置默认值:DropDownList1.Items[i].Selected=true;绑定:DropDownList1.DataSource = dataSet.Tables["Tabl ...

  6. Java设计模式应用——桥接模式

    性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...

  7. python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法

    生成指定长度的随机数字密码 生成指定长度的随机字母密码 生成指定长度的随机数字和字母的混合 #encoding=utf-8   import random import string class pa ...

  8. linux 图形界面的安装

    本文内容主要摘自:http://blog.csdn.net/hotday_kevin/article/details/8310054 文中图形的安装和卸载都给了两种方式,貌似是因为都是版本的问题而不同 ...

  9. Django框架----基础

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

  10. mysql分类和事务回滚

    主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗 ...