原创博文,转载请注明出处!

# 题目

【剑指offer】找出数组中任意一个重复的数字,C++实现

# 思路

       对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同。如果存在重复数字,则在排序的过程中会出现不同下标对应相同数字的情况。

举例:

数组2310253,下标0对应的数字是2,数字2与下标0不一致,交换下标0和下标2对应的数字,交换后的结果为1320253;

数组1320253,下标0对应的数字是1,数字1与下标0不一致,交换下标0和下标1对应的数字,交换后的结果为3120253;

数组3120253,下标0对应的数字是3,数字3与下标0不一致,交换下标0和下标3对应的数字,0123253。

数组0123253,下标4对应的数字是2,下标2对应的数字也是2,下标4对应的数字是重复数字。

【剑指offer】找出数组中任意一个重复的数字,C++实现

class Solution { 2 public: 3 /* 4 numbers数组 5 length数组长度 6 duplication重复数字 7 */ 8 bool duplicate(int numbers[], int length, int* duplication) 9 { 10 // 检查数组边界:空数组/长度小于0 11 if(numbers == nullptr || length <= 0) 12 return false; 13 14 // 检查数组元素:数组元素不符合题干 15 for(int i=0; i<length;++i) 16 { 17 if(numbers[i]<0 || numbers[i]>length-1) 18 return false; 19 } 20 21 /* 找出任意一个重复元素*/ 22 for(int i=0;i<length;i++) 23 { 24 while(numbers[i]!=i) 25 { 26 // 查找重复元素 27 if(numbers[i] != numbers[numbers[i]]) 28 { 29 int temp = numbers[i]; 30 numbers[i] = numbers[temp]; 31 numbers[temp] = temp; 32 } 33 else 34 { 35 *duplication = numbers[i]; 36 return true; 37 } 38 39 } 40 } 41 42 return false; 43 } 44 };
View Code

相关文章:

  • 2021-06-13
  • 2021-12-15
  • 2022-12-23
  • 2021-04-16
  • 2021-10-28
  • 2022-02-18
猜你喜欢
  • 2022-12-23
  • 2022-01-20
  • 2021-12-02
  • 2022-12-23
  • 2021-09-29
  • 2021-07-11
  • 2021-08-16
相关资源
相似解决方案