Это простая проблема. Прежде чем перейти к коду, вы должны знать, что такое двоичное число и как мы преобразуем двоичное число в десятичное.
Короче говоря, мы записываем любое двоичное число, используя две цифры, 0 и 1.
Пример: 101101. Чтобы узнать больше об этом, проверьте здесь.
Математическая формула для преобразования любого двоичного числа в десятичное показана на изображении ниже:
Поскольку двоичные числа выражаются в системе счисления с основанием 2. Таким образом, мы получим десятичную дробь, умножая каждую двоичную цифру на 2, возведенную в степень позиции цифры. Сумма всех этих значений даст нам десятичное число.
Это двоичное число хранится в отдельном связанном списке с head
в качестве начального эталонного узла. Для каждого узла значение будет либо 0, либо 1 (т. е. связанный список хранит представление двоичного числа).
Каждый экземпляр узла будет иметь value
и указатель next
, которые будут указывать на следующий узел.
Пример:
Реализация с использованием JavaScript:
Мы реализуем функцию getNumber
, которая будет иметь параметр импорта binary
, который по сути является ссылкой на заголовок связанного списка. Функция вернет десятичное число, то есть наше решение.
Поскольку сначала нам нужно знать положение цифры в данном связанном списке (согласно приведенной выше математической формуле). Таким образом, чтобы получить позиции, нам нужно найти длину заданного связанного списка:
const getLengthOfLL = (head) => { let result = 0; let temp_head = head; while(temp_head !== null) { result++; temp_head = temp_head.next; } return result; }
Теперь мы повторим связанный список и начнем добавлять результат для цифр со значением 1 и игнорировать итерации со значением 0.
Мы начинаем с последней позиции и уменьшаем позицию с каждой итерацией, а с помощью Math.pow(2, position)
мы будем хранить сумму в переменной result
.
var getNumber
= function(binary) {
let listLength = getLengthOfLL(binary) - 1;
let result = 0;
while (binary !== null) {
if (binary.value == 1) {
result = result + Math.pow(2, listLength);
}
listLength--;
binary = binary.next;
}
return result;
};
Вот и все.
Теперь потренируйтесь на платформе leetcode здесь.
Ссылка на другие вопросы по программированию
Поиск максимальной выгоды при планировании работы
Поиск совершенных, недостаточных и избыточных чисел
Найдите, сколько воскресений выпало на первое число месяца в данном году