zoukankan      html  css  js  c++  java
  • 【剑指offer】找出数组中任意一个重复的数字,C++实现

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

    # 题目

    image

    # 思路

           对于长度为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对应的数字是重复数字。

    image

      1 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

    # 复杂度

    • 时间复杂度为O(n)
    • 空间复杂度为O(1)

    # 测试用例

    • 空指针
    • 数字超界
    • 不包含重复数字
    • 包含一个重复数字
    • 包含多个重复数字
  • 相关阅读:
    CodeForces 567C. Geometric Progression(map 数学啊)
    【 D3.js 高级系列 — 7.0 】 标注地点
    我的家乡:三河古镇已经登上央视CCTV-1新闻联播啦!
    自考--初读
    微信支付v2开发(6) 发货通知
    微信支付v2开发(7) 告警通知
    微信支付v2开发(8) 维权通知
    微信公众平台注册
    微信公众平台开发(95) 世界杯赛程
    微信公众平台开发(96) 多个功能整合
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/9024943.html
Copyright © 2011-2022 走看看