Битовая манипуляция в Python и Java - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над проблемой, в которой указанный массив выглядит следующим образом:

"При наличии непустого массива целых чисел каждый элемент появляется три раза, кроме одного, который появляется ровно один раз. Найдите, чтоодин. "

Например:

Input: [2,2,3,2]
Output: 3

Я пытаюсь решить это с помощью битовой манипуляции, и мой код на Python выглядит следующим образом:

def singleNumber(self, nums):

    ans = 0
    for i in range(31):
        summ = 0
        for num in nums:
            dig = (num>>i)&1
            if dig:
                summ += 1
        summ = summ%3
        if summ:
            ans = ans | summ<<i

    return ans

Все, что я пытаюсь сделать, это получить последний бит каждого числа в массиве и подсчитать количество получаемых единиц, а затем% 3, чтобы получить точные 1 оставшиеся биты, и сдвинуть его, чтобы получить правильный ответ.

Это терпит неудачу тестовые случаи, которые имеют отрицательные входные данные, что-то вроде:

[-2,-2,1,1,-3,1,-3,-3,-4,-2]
O/P: 2147483644
Expected O/P: -4

Однако, когда я делаю то же самое в Java, это работает!Код выглядит следующим образом:

class Solution {
public int singleNumber(int[] nums) {

    int ans = 0;
    int dig = 0;

    for(int i = 0; i <=31; i++){
        int sum = 0;
        for(int num: nums){

            dig = (num>>i)&1;
            if(dig!=0){
                sum = sum + 1;    
            }
            sum = sum%3;
        }
        if(sum!= 0){
            ans = ans | sum<<i;
        }

    }
    return(ans);
   }
}

Как биты, представленные в Python, вызывают эту разницу?Может кто-нибудь сказать мне разницу в битовых манипуляциях на обоих языках, Python и Java?

1 Ответ

0 голосов
/ 12 июня 2018

Java имеет 32-битный фиксированный размер int.Но в Python нет явного ограничения для чисел.читайте в ( Максимальное значение для длинного целого числа )

Хакерское решение вашей проблемы (может работать не во всех случаях):

return ans - 2**(32-1)
...