Viktor
теперь всё чётенько. как и должно было быть.
V
сегодняшняя задача. объясните, почему (5, 7) должен дать 4? 5 & 7 == 5
V
а, я понял
Viktor
ух. классная задачка.
Viktor
напечатался в консоли двоичное представление чисел в разных диапазонах
Viktor
прежде чем увидеть прикол
V
я решил в лоб с одной лишь оптимизацией — прошло
Viktor
мне кажется, что я так же сделал. с той же самой оптимизацией.
Viktor
скажем так, когда нуля не избежать 😂
V
да)
V
теперь смотрю чужие решения — там прямо огонь
Evgeniy
Хорошая задача. Немного подумать пришлось
Иван
Согласен, мне тоже понравилась)
Иван
И не сильно обременяет и есть удовольствие от решения
Evgeniy
А кто как решил? Я с помощью логарифма и сдвига
Иван
Аналогично)
Evgeniy
https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/593506/C-elementary-bitwise-O(1)-solution
Иван
Не ну тут что-то слишком красиво у тебя)
Evgeniy
А у тебя как?)
V
а зачем тут нужен логарифм?
Иван
Теперь не хочу показывать)
Иван
сейчас
Evgeniy
а зачем тут нужен логарифм?
Найти какое максимальное число, степень двойки, влезет в разницу между границами
Evgeniy
И это значит, что в этом диапазоне у чисел точно будут меняться биты
Evgeniy
И битовое И даст 0
Иван
Да, потому что если сделать & для чисел, чьё битовое представление требует на бит больше получится 0
V
у меня вышло так https://github.com/vtambourine/leetcode-go/blob/master/0201.bitwise_and_of_numbers_range/bitwise_and_of_numbers_range.go
Иван
А как вы кодом делитесь?
Иван
С лииткода?
V
я просто комичу решения в свой репозиторий
Evgeniy
Пишу там пост в Discuss
V
или что-то другое имеешь ввиду?
Иван
Ну да, я вижу что у тебя гитхаб, тут понятно) Я удивился что Клён поделился. Но теперь понял, спасибо
Evgeniy
Показалось, что по времени не пройдет
Порридж В Ко-ливинге
Там можно брутфорсом?
Порридж В Ко-ливинге
Кто нить пробовал?
Evgeniy
Да
Evgeniy
Выше
Порридж В Ко-ливинге
Там или O(N) или O(1) как я понял
Evgeniy
Ну да
Иван
https://pastebin.com/NERYLZzA
Иван
Я так написал. Просто не знал как это более красиво оформить
Иван
Но как я понимаю, Клён, у тебя точно такое же решение?
Evgeniy
У меня нет цикла
Иван
Этот цикл срабатывает очень редко)
Иван
Только если m и n в одинаковом диапазоне степеней. Во всех остальных случаях 0(1).
Evgeniy
При len 0 можно n & m убрать, например. Просто число вернуть
Evgeniy
А что ифе делается?
Evgeniy
где на нули проверяешь
V
Кто нить пробовал?
вот такой брутфорс у меня прошел: func rangeBitwiseAnd(m int, n int) int { ans := m for m < n { if ans == 0 { return 0 } m++ ans &= m } return ans }
V
собственно, после этого решения я уже стал дулмать, как решить быстрее
Иван
Вычисляется степень двойки последнего числа и первого. Просто при переходе на один разряд больше происходит обнуление. Например 7 - 111 а 8 - 1000. 0111 & 1000 = 0000 и дальше нет смысла проверять так как всегда будет 0
Иван
Ну и значит если последнее число хотя бы на разряд больше первого - значит нет смысла цикл запускать
Иван
рано или поздно превратится в 0
Evgeniy
А, ну да. Та же идея, просто по другому)
Evgeniy
То то я думал, чего так много нулей получается. При тестах
Иван
Да) Сразу на мысли и наводит
Иван
А у меня так не прошло
Иван
Причём последний кейс
Evgeniy
Да) Сразу на мысли и наводит
https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/593239/Easy-python-with-explanation-(100-memory)
Evgeniy
вот похоже на твоё, вроде
Viktor
Я без логарифма проверку делал такую: n >= 2 * m – если больше чем в два раза значит одна степень двойки лежит между n и m. Единственно это может дать переполнение, поэтому несложное алгебраическое преобразование даёт ту же проверку n - m >= m.
Иван
вот похоже на твоё, вроде
Ого, да) Только гораздо элегантней)
Viktor
В остальном брутфорсик вышел на коротком интервале.
Viktor
не, потом брутфорс. т.е. если мы понимает, что «точно нуля» не будет — в цикле сделаем, что просят.
Evgeniy
Ясно, понял
Viktor
@KlenZeleny а как у тебя вот это работает m & n & (~0 << shift), сможешь рассказать?
Evgeniy
m & n оставит нам единицы, которые есть в каждом числе у границ диапазона. Но чтобы они остались нужно их & с единицей. ~0 даст нам набор единиц. А shift даст нам сдвиг на столько битов, сколько точно менялись при последовательном & для всех чисел.
Иван
you are a machine)
Evgeniy
И они нам не нужны. Но могут быть нужны старшие биты на "перекрытии" старших битов у двух границ.
Evgeniy
you are a machine)
Всё бы так быстро решалось)
Evgeniy
Если проще, то мы выкидываем степени двойки, которые влезают в разницу n-m. Те, которые получится. И оставляем те, которые не получится
Evgeniy
На то число степеней, которые выкинули, нам и нужен сдвиг
Viktor
Помните радостную для многих новость? В этом году в ШАД можно поступить и без знания хардкорной математики. Для таких студентов прочитают специальный адаптационный курс. До этого шадовцам, поступившим без сильной математической базы, приходилось гораздо сложнее. Прочитайте историю Ваге Егиазаряна о том, как Школа анализа данных вновь открыла для него высшую математику и путь в науку 🎓 https://ya.cc/t/1KF88Iu9Ai2tD