У меня есть два числа 1100 и 1010, и я хотел бы узнать количество различных соответствующих цифр среди них, поэтому ответ для приведенного выше примера будет 2, начиная со 2-й цифры и 3-й цифры оба числа разные.

Я пользуюсь этой программой

def req_fun(arr, b): # arr :['1100', '0011', '0101', '1110'], b:'1010'
    count = 0
    for i in arr:
        for j in range(len(b)):
            count += int(i[j])^int(b[j])
    return count

Мне нужен был лучший способ добиться этого, так как я получаю TLE (превышено ограничение по времени), используя этот подход.

ПРИМЕЧАНИЕ: все числа будут строго 0 и 1

-2
p.ram 29 Июн 2019 в 12:59

4 ответа

Лучший ответ

Мне было непонятно, что если вы хотите вернуть общее количество разных цифр или количество разных цифр на элемент в списке arr. Поэтому я предполагаю, что вы хотите вернуть общее количество разных цифр.

Если вы суммируете оба числа (алгебраическую сумму), то сумма двух соответствующих цифр равна 1 тогда и только тогда, когда две цифры разные, и этот факт можно использовать для подсчета количества разных цифр, как показано ниже

def count_different(arr, b):
    diff_digits = 0
    for i in arr:
        diff_digits += str(int(i)+int(b)).count('1')
    return diff_digits

Если вы хотите вернуть количество различных цифр для каждого элемента в arr, они добавляют каждый счет в список и возвращают список.

def count_different(arr, b):
    diff_digits = 0
    l = []
    for i in arr:
        diff_digits += str(int(i)+int(b)).count('1')
        l.append(diff_digits)
    return l
1
user10647398user10647398 29 Июн 2019 в 12:42
sum(a & 2**c != b & 2**c for c in range(4))

Это 4 ваша жестко закодированная длина двоичных представлений. a и b ваши номера.

Редактировать: это sum действует как количество истинных значений, поскольку Истина оценивается в 1, а Ложь в 0.

0
ipaleka 29 Июн 2019 в 14:25

Вам нужно расстояние Хемминга двух строк, то есть различия между двумя строками ( равные по длине).

К счастью, есть также код Python в Википедии, так что вы можете просто взять и использовать Это.

Код:

def hamming_distance(s1, s2):
    """Return the Hamming distance between equal-length sequences"""
    if len(s1) != len(s2):
        raise ValueError("Undefined for sequences of unequal length")
    return sum(el1 != el2 for el1, el2 in zip(s1, s2))
0
crissal 29 Июн 2019 в 10:05

Вы можете использовать чистый способ Python sum в генераторе с zip():

a, b = 1100, 1010

print(sum(x != y for x, y in zip(str(a), str(b))))
# 2
1
Austin 29 Июн 2019 в 10:04