Algorithm to determine if array contains n…n+m?

前端 未结 30 3175
清酒与你
清酒与你 2020-11-28 01:45

I saw this question on Reddit, and there were no positive solutions presented, and I thought it would be a perfect question to ask here. This was in a thread about interview

30条回答
  •  误落风尘
    2020-11-28 01:55

    Counter-example for XOR algorithm.

    (can't post it as a comment)

    @popopome

    For a = {0, 2, 7, 5,} it return true (means that a is a permutation of the range [0, 4) ), but it must return false in this case (a is obviously is not a permutaton of [0, 4) ).

    Another counter example: {0, 0, 1, 3, 5, 6, 6} -- all values are in range but there are duplicates.

    I could incorrectly implement popopome's idea (or tests), therefore here is the code:

    bool isperm_popopome(int m; int a[m], int m, int  n)
    {
      /** O(m) in time (single pass), O(1) in space,
          no restrictions on n,
          no overflow,
          a[] may be readonly
      */
      int even_xor = 0;
      int odd_xor  = 0;
    
      for (int i = 0; i < m; ++i)
        {
          if (a[i] % 2 == 0) // is even
            even_xor ^= a[i];
          else
            odd_xor ^= a[i];
    
          const int b = i + n;
          if (b % 2 == 0)    // is even
            even_xor ^= b;
          else
            odd_xor ^= b;
        }
    
      return (even_xor == 0) && (odd_xor == 0);
    }
    

提交回复
热议问题