zoukankan      html  css  js  c++  java
  • PHP a[n+1]共有n+1个数,数值范围是1~n,a中有1个数重复,其他各不相同,找出这个重复的数

     1 <?php
     2     #a[n+1]共有n+1个数,数值范围是1~n,a中有1个数重复,其他各不相同,找出这个相同的数
     3     
     4     #第一种方法,利用 a数组的和减去1+2+3+...+n的和,得到的结果就是重复数字
     5     function get_dup($a) {
     6         $size = count($a);
     7         $suma = 0;
     8         $sumn = 0;
     9         for ($i = 0; $i < $size; $i++) {
    10             $suma += $a[$i];
    11             $sumn += $i;
    12         }
    13 
    14         return $suma - $sumn;
    15     }
    16 
    17     #第二种方法,利用异或
    18     #异或的性质: A xor A = 0; 0 xor A = A;
    19     #解析:假设重复的数是A,除了A以外的1~n的异或值为B,则对数组a所有数进行异或,可以得到 A xor A xor B = B
    20     #对于1~n的各不相同的n个数,对他们进行异或的值是 A xor B
    21     #对上述两步得到的值进行异或有 (A xor A xor B) xor (A xor B) = A,这样就求出了A
    22     function get_dup_xor($a) {
    23         $x = $a[0];
    24         for ($i = 1; $i < count($a); $i++) {
    25             $x ^= $a[$i] ^ $i;
    26         }
    27 
    28         return $x;
    29     }
    30 
    31     #第三种方法,使用bitmap
    32     function get_dup_bitmap($a) {
    33         $bitmap = array();
    34         for ($i = 0; $i < count($a); $i++) {
    35             if (!isset($bitmap[$a[$i]])) {
    36                 $bitmap[$a[$i]] = 1;
    37             } else {
    38                 return $a[$i];
    39             }
    40         }
    41     }
    42 
    43     #第四种方法,利用修改数组内值
    44     #这种方法在数组以0开头的时候会有问题,因为a[0]=0,下次还是跳到a[0] = null,直接就把0当重复的输出了
    45     #当然了,按照题意不可能以0开头
    46     function get_dup_mod($a) {
    47         $i = 0;
    48         while ($i < count($a)) {
    49             if ($a[$i] == null) {
    50                 return $i;
    51             }
    52             $j = $i;
    53             $i = $a[$i]; #如果数组中存在重复值,则$i必然会两次指向同一个下标,第二次指向同一个元素时元素已置为null
    54             $a[$j] = null;
    55         }
    56     }
    57 
    58     $a = array(1, 2, 5, 3, 4, 5, 6, 7, 8, 9);
    59     echo get_dup($a) . "<br>";
    60     echo get_dup_xor($a) . "<br>";
    61     echo get_dup_bitmap($a) . "<br>";
    62     echo get_dup_mod($a) . "<br>";
    63 ?>

    5
    5
    5
    5

  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/zemliu/p/2709012.html
Copyright © 2011-2022 走看看