LeetCode 260には一度しか現れない数字(超詳細)


LeetCode 260には一度しか現れない数字
LC練習問題
  • LeetCode 260には一度しか現れない数字
  • テーマ概要
  • 構想説明
  • コードセグメントごとに
  • を説明する
  • 完全解答

  • タイトルの簡単な説明
    整数配列numsが与えられ、2つの要素が1回しか現れず、残りのすべての要素が2回しか現れない.一度しか現れない2つの要素を見つけます.任意の順序で答えを返すことができます.
    ステップアップ:あなたのアルゴリズムは線形時間の複雑さを持つべきです.定数空間の複雑さだけを使って実現できますか?
    考え方の説明
                      ,                nums,
                     ,           。 
                   ,                ,         。
                    ,                       
       (                    ,       )。
                ,     ,
                               ,         。
                                    ,
                 ,               ,               ,
                   ,            。          ,            。
    

    コードセグメント別に説明
    //         ,          
    
        //          
        int i = 0;
        int ret = 0;
        for (i = 0;i < numsSize;i++)
        {
         
            ret ^= nums[i];
        }
    
    //        ,                    1        1
    
        //           1
        int m = 0;
        while (((ret >> m) & 1) != 1)
        {
         
            m++;
        }
    
                  1 ?
               ,                    1
                  ?
           ,                ,                  ,
                 1    1     ,
                        ,                   。
    
     // m  1       
     // m  0       
    
        // m  1       
        // m  0       
        int x1 = 0;
        int x2 = 0;
        for (i = 0;i < numsSize;i++)
        {
         
            if ((nums[i] >> m) & 1)
            {
         
                x1 ^= nums[i];
            }
            else
            {
         
                x2 ^= nums[i];
            }
    
        }
    

    完全な回答
               
    
    int* singleNumber(int* nums, int numsSize, int* returnSize)
    {
         
        //          
        int i = 0;
        int ret = 0;
        for (i = 0;i < numsSize;i++)
        {
         
            ret ^= nums[i];
        }
        //           1
        int m = 0;
        while (((ret >> m) & 1) != 1)
        {
         
            m++;
        }
    
        // m  1       
        // m  0       
        int x1 = 0;
        int x2 = 0;
        for (i = 0;i < numsSize;i++)
        {
         
            if ((nums[i] >> m) & 1)
            {
         
                x1 ^= nums[i];
            }
            else
            {
         
                x2 ^= nums[i];
            }
    
        }
        int* RetArr = (int*)malloc(sizeof(int) * 2);
        RetArr[0] = x1;
        RetArr[1] = x2;
        *returnSize = 2;
        return RetArr;
    }
    

    どこか分からないことがあったらメッセージをください.