classSolution{public:intfindRepeatNumber(vector<int>& a){auto len = a.size();for(size_t i =0; i < len; i++){while(a[i]!= i){//if(a[i] != i){ //由第二点,不能为ifif(a[i]== a[a[i]])return a[i];swap(a[i], a[a[i]]);}}return-1;}};
四、测试程序
/*******************************************************************
Copyright(c) 2016, Harry He
All rights reserved.
Distributed under the BSD license.
(See accompanying file LICENSE.txt at
https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
*******************************************************************///==================================================================// 《剑指Offer——名企面试官精讲典型编程题》代码// 作者:何海涛//==================================================================// 面试题3(一):找出数组中重复的数字// 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,// 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},// 那么对应的输出是重复的数字2或者3。#include<cstdio>// 参数:// numbers: 一个整数数组// length: 数组的长度// duplication: (输出) 数组中的一个重复的数字// 返回值:// true - 输入有效,并且数组中存在重复的数字// false - 输入无效,或者数组中没有重复的数字boolduplicate(int numbers[],int length,int*duplication){if(length <=0|| numbers ==nullptr)returnfalse;for(int i =0; i < length; i++){if(numbers[i]<0|| numbers[i]> length -1)returnfalse;}for(int i =0; i < length;++i){while(numbers[i]!= i){if(numbers[i]== numbers[numbers[i]]){*duplication = numbers[i];returntrue;}auto tmp = numbers[i];
numbers[i]= numbers[tmp];
numbers[tmp]= tmp;}}returnfalse;}// ====================测试代码====================boolcontains(int array[],int length,int number){for(int i =0; i < length;++i){if(array[i]== number)returntrue;}returnfalse;}voidtest(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");elseprintf("FAILED.\n");}elseprintf("Passed.\n");}elseprintf("FAILED.\n");}// 重复的数字是数组中最小的数字voidtest1(){int numbers[]={2,1,3,1,4};int duplications[]={1};test("Test1", numbers,sizeof(numbers)/sizeof(int), duplications,sizeof(duplications)/sizeof(int),true);}// 重复的数字是数组中最大的数字voidtest2(){int numbers[]={2,4,3,1,4};int duplications[]={4};test("Test2", numbers,sizeof(numbers)/sizeof(int), duplications,sizeof(duplications)/sizeof(int),true);}// 数组中存在多个重复的数字voidtest3(){int numbers[]={2,4,2,1,4};int duplications[]={2,4};test("Test3", numbers,sizeof(numbers)/sizeof(int), duplications,sizeof(duplications)/sizeof(int),true);}// 没有重复的数字voidtest4(){int numbers[]={2,1,3,0,4};int duplications[]={-1};// not in use in the test functiontest("Test4", numbers,sizeof(numbers)/sizeof(int), duplications,sizeof(duplications)/sizeof(int),false);}// 没有重复的数字voidtest5(){int numbers[]={2,1,3,5,4};int duplications[]={-1};// not in use in the test functiontest("Test5", numbers,sizeof(numbers)/sizeof(int), duplications,sizeof(duplications)/sizeof(int),false);}// 无效的输入voidtest6(){int*numbers =nullptr;int duplications[]={-1};// not in use in the test functiontest("Test6", numbers,0, duplications,sizeof(duplications)/sizeof(int),false);}intmain(){test1();test2();test3();test4();test5();test6();return0;}
五、运行结果
main.cpp: In function'void test1()':
main.cpp:126:113: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test1", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
^
main.cpp: In function'void test2()':
main.cpp:134:113: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test2", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
^
main.cpp: In function'void test3()':
main.cpp:142:113: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test3", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
^
main.cpp: In function'void test4()':
main.cpp:150:114: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test4", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
^
main.cpp: In function'void test5()':
main.cpp:158:114: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test5", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
^
main.cpp: In function'void test6()':
main.cpp:166:86: warning: ISO C++ forbids converting a string constant to 'char*'[-Wwrite-strings]
test("Test6", numbers, 0, duplications, sizeof(duplications) / sizeof(int), false);
^
Test1 begins: Passed.
Test2 begins: Passed.
Test3 begins: Passed.
Test4 begins: Passed.
Test5 begins: Passed.
Test6 begins: Passed.