求 2 的最大幂的二进制字符串问题

Binary String Question to find maximum power of 2

我们给定了一个长度为 n 的二进制字符串,我们可以循环移位这个字符串任意数量的 times.Let X 作为字符串 s 的十进制表示。找到可以整除 X 的 2 的最大幂,如果它可以被任意大的幂整除打印“-1”。对于结果,您需要打印一个整数表示 2 的最大幂 X可以整除。 前任: 输入: 0011 输出: 2

解释:我们可以将字符串循环移位 2 次得到“1100”,它可以被 2^2 整除,因此答案是 2。

这是我的解决方案..但是它在大多数测试用例上给出了答案,在一些测试用例上给出了错误的答案..

int highestpower(int n)
{
    return (n & (~(n - 1)));
}

int findnum(string s)
{
    int value = 0;
    int p=0;
    for(int i = s.length()-1;i>=0;i--)
    {
        value = value+pow(2,p)*(s[i]-'0');
        p++;
    }
    return value;
}

int maximumPower(string s) {
    int ans = 0;
    for(int i=0;i<s.length();i++)
    {
        
        int num = findnum(s.substr(i)+s.substr(0,i));
        ans = max(ans,highestpower(num));
    }
    return ans/2;
}

我该如何解决这个问题?谢谢..

我有点难以理解你的代码逻辑。实际上,它在我测试过的所有情况下都失败了。

而且,好像还挺over-complicated。计算连续零的数量就足够了。我们只需要注意 该计算必须以循环方式执行。例如s == 00100,则计数为4,移位后得到10000。处理这种循环的一种简单方法是连接字符串 s2 = s+s = 0010000100,然后计算得到的字符串 s2 中连续零的最大数量。另外,我们必须注意输入的字符串不是只有零组成的。

在下面的代码中,我将你的代码 (maximumPower) 与我的代码 (maximumPower_new) 在几个不同的输入上进行了比较。

结果:

0011    : 2  new: 2
0100010 : 4  new: 3
00100   : 8  new: 4

代码:

#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>

int highestpower(int n)
{
    return (n & (~(n - 1)));
}

int findnum(const std::string& s)
{
    int value = 0;
    int p=0;
    for(int i = s.length()-1;i>=0;i--)
    {
        value = value+pow(2,p)*(s[i]-'0');
        p++;
    }
    return value;
}

int maximumPower(const std::string& s) {
    int ans = 0;
    for(int i = 0; i < s.length(); i++)
    {
        int num = findnum(s.substr(i)+s.substr(0,i));
        ans = std::max(ans,highestpower(num));
    }
    return ans/2;
}

int maximumPower_new (const std::string& s) {
    int n = s.length();
    if (n == 0) return -1;
    std::string s2 = s + s;
    int count = 0;
    int count_max = 0;
    for (auto c: s2) {
        if (c == '0') {
            count ++;
        } else {
            count_max = std::max(count, count_max);
            count = 0;
        }
    }
    count_max = std::max(count, count_max);
    if (count_max >= n) return -1;
    else return count_max;
}

int main() {
    for (std::string s: {"0011", "0100010", "00100"}) {
        std::cout << s << " : " << maximumPower(s) << " new: " << maximumPower_new(s) << "\n";
    }
}