《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)
- // 面试题3(一):找出数组中重复的数字
- // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
- // 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
- // 那么对应的输出是重复的数字2或者3。
- #include <iostream>
- using namespace std;
- bool duplicate(int* numbers,int length,int& num)
- {
- if (numbers == NULL || length <= )//判断输入是否对
- return false;
- for (int i = ; i < length; i++)//判断是否满足题目条件
- {
- if (numbers[i] < || numbers[i] >= length)
- return false;
- }
- for (int i = ; i < length; i++)//核心思想:轮流找自己位置,如果那个位置是你,那你就是重复的
- {
- while (numbers[i] != i)
- {
- if (numbers[i] == numbers[numbers[i]])
- {
- num = numbers[i];
- return true;
- }
- int temp = numbers[i];
- numbers[i] = numbers[temp];
- numbers[temp] = temp;
- }
- }
- return false;
- }
- // ====================测试代码====================
- bool contains(int array[], int length, int number)
- {
- for (int i = ; i < length; ++i)
- {
- if (array[i] == number)
- return true;
- }
- return false;
- }
- void test(const char* testName, int numbers[], int lengthNumbers, int expected[], int expectedExpected, bool validArgument)
- {
- printf("%s begins: ", testName);
- int duplication;
- bool validInput = duplicate(numbers, lengthNumbers, duplication);
- if (validArgument == validInput)
- {
- if (validArgument)
- {
- if (contains(expected, expectedExpected, duplication))
- printf("Passed.\n");
- else
- printf("FAILED.\n");
- }
- else
- printf("Passed.\n");
- }
- else
- printf("FAILED.\n");
- }
- // 重复的数字是数组中最小的数字
- void test1()
- {
- int numbers[] = { , , , , };
- int duplications[] = { };
- test("Test1", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
- }
- // 重复的数字是数组中最大的数字
- void test2()
- {
- int numbers[] = { , , , , };
- int duplications[] = { };
- test("Test2", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
- }
- // 数组中存在多个重复的数字
- void test3()
- {
- int numbers[] = { , , , , };
- int duplications[] = { , };
- test("Test3", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
- }
- // 没有重复的数字
- void test4()
- {
- int numbers[] = { , , , , };
- int duplications[] = { - }; // not in use in the test function
- test("Test4", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
- }
- // 没有重复的数字
- void test5()
- {
- int numbers[] = { , , , , };
- int duplications[] = { - }; // not in use in the test function
- test("Test5", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
- }
- // 无效的输入
- void test6()
- {
- int* numbers = nullptr;
- int duplications[] = { - }; // not in use in the test function
- test("Test6", numbers, , duplications, sizeof(duplications) / sizeof(int), false);
- }
- void main()
- {
- test1();
- test2();
- test3();
- test4();
- test5();
- test6();
- system("pause");
- }
- //这个代码写的我很难受
- //首先是子函数duplicate(),写的时候错了很多地方,比如括号位置,return等等,应该还是不熟练
- //其次是人家写的测试代码,我的天,真是,写的太细了
- //关注sizeof(numbers) / sizeof(int)
《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)的更多相关文章
- 《剑指offer》第十八题(删除链表中重复的结点)
// 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...
- 剑指offer——python【第54题】字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 【剑指offer】面试题68(补充) 0到n-1中缺失的数字(二分法的进一步应用)
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内. 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 输出 输入:[0,1,2, ...
- 剑指offer——python【第56题】删除链表中的重复节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 《剑指offer》第五十题(字符流中第一个只出现一次的字符)
// 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从 // 字符流中只读出前两个字符"go"时,第一 ...
- 《剑指offer》面试题53 - II. 0~n-1中缺失的数字
问题描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [ ...
- 剑指Offer(三十二):把数组排成最小的数
剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
随机推荐
- 微信小程序-1
微信小程序 (开发微信小程序基础:HTML+js+css) l 准备工作 工具安装 开发工具是由微信官方提供 项目的预览(校验环境) l 开发体验阶段 - Hello world ...
- Docker深入浅出2
Docker系统架构 Docker使用客户端-服务端(c/s)架构模式,使用远程api来管理和创建Docker容器. docker容器通过Docker镜像来创建. 容器与镜像的关系类似于面向对象编程中 ...
- cordova+Android Studio 1.0+ionic+win7(转)
转自http://blog.csdn.net/fuyunww/article/details/42216125 目录(?)[-] 在项目目录下执行 a创建工程 b添加平台支持 c添加插件在Androi ...
- 002-ubuntu安装
一.安装了ubuntu desktop版本后: 1.进行桥接联网. 2.运行更新:#sudo apt-get update. 3.安装net-tools网络工具包:#sudo apt install ...
- ASP.NET控件--DropDownList
设置默认值:DropDownList1.Items[i].Selected=true;绑定:DropDownList1.DataSource = dataSet.Tables["Tabl ...
- Java设计模式应用——桥接模式
性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...
- python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法
生成指定长度的随机数字密码 生成指定长度的随机字母密码 生成指定长度的随机数字和字母的混合 #encoding=utf-8 import random import string class pa ...
- linux 图形界面的安装
本文内容主要摘自:http://blog.csdn.net/hotday_kevin/article/details/8310054 文中图形的安装和卸载都给了两种方式,貌似是因为都是版本的问题而不同 ...
- Django框架----基础
一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...
- mysql分类和事务回滚
主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗 ...