Ищем побитовое решение для этого - PullRequest
0 голосов
/ 06 мая 2020

Вам дан массив из n целых чисел только для чтения. Узнайте, встречается ли какое-либо целое число более n / 3 раз в массиве за линейное время и постоянное дополнительное пространство.

Если да, вернуть целое число. Если нет, верните -1. ​​

Если существует несколько решений, верните любое.

Пример:

Input : [1 2 3 1 1]
Output : 1 

1 встречается 3 раза, что больше 5 / 3 раза.

Я решил эту проблему и нашел несколько решений в Google. Но мне нужен побитовый подход. Если бы вы могли мне помочь, я был бы признателен.

Решение без побитового:

int Solution::repeatedNumber(const vector<int> &A)
{
    int len = A.size();
    if (A.size() == 0)
    {
        return -1;
    }
    if (A.size() == 1)
    {
        return A[0];
    }
    int c1 = A[0];
    int c2 = A[1];
    int c1count = 0;
    int c2count = 0;

    for(int num: A)
    {
        if(c1 == num)
        {
            c1count++;
        }
        else if(c2 == num)
        {
            c2count++;
        }
        else if(c1count == 0)
        {
            c1 = num;
            c1count = 1;
        }

        else if(c2count == 0)
        {
            c2 = num;
            c2count = 1;
        }
        else
        {
            c1count--;
            c2count--;
        }
    }

    c1count = 0;
    c2count = 0;
    for(int num : A)
    {
        if(c1 == num)
        {
            c1count++;
        }
        else if(num == c2)
        {
            c2count++;
        }
    }

    if(c1count > len/3)
    {
        return c1;
    }
    else if(c2count > len/3)
    {
        return c2;
    }
    else
    {
        return -1;
    }
}
...