Back to Leetcode

Readme

Binary_Search/3677.Count-Binary-Palindromic-Numbers/Readme.md

latest1.1 KB
Original Source

3677.Count-Binary-Palindromic-Numbers

假设n的二进制长度是maxLen,那么对于任何1<=L<maxLen的二进制回文数自然都符合“小于n”的条件。这些二进制回文数与它的“前半段”有一一对应的关系。也就是说,我们遍历所有的“前半段”,就能构造出所有长度为L的二进制回文数。举个例子,如果L=8,它一半的长度h=4,那么我们遍历1000~1111,将它们各自翻转拼接,就对应了所有长度为8的二进制回文数。注意,如果L=7,它一半的长度h也是4,我们同样遍历1000~1111,将它们各自翻转拼接(但是有一个中轴位),它们依然能对应所有长度为7的二进制回文数。

接下来考虑L=maxLen,且“小于等于n”的二进制回文数。比较简单的处理就是用二分搜值。计算h=(L+1)/2,然后“前半段”有下限mn=1<<(h-1),上限是mx=(1<<h)-1,我们二分搜值找到最大的、小于等于n的数m,那么m-mn+1就是答案。但是注意,存在并没有解的可能。比如h=1时,就有mn>mx的情况,所以需要对收敛的解做二次验证。