【问题标题】:Find the number of steps a string can be reduced to 0求一个字符串可以减到0的步数
【发布时间】:2020-04-18 01:56:46
【问题描述】:

我的任务:

给定一个非负整数变量 $Z$。有两个动作可以改变它的值:

  • 如果$Z$是奇数,则减1;

  • 如果 $Z$ 是偶数,则除以 2。

执行这些操作,直到 $Z$ 的值变为 0。

你必须写一个函数:int solution(string &S); 这样当给定一个字符串 S 时,该字符串由包含变量 $Z$ 初始值的二进制表示的 $N$ 个字符组成,返回步数 之后,$Z$ 的值将变为 0,如上所述。

#include<iostream>

int solution(string &S) {
    int x = stoi(S, 0, 2);
    int count = 0;
    while (x != 0) {
        if (x % 2 == 0) {
            x /= 2;
            count++;
        } else {
            x -= 1;
            count++;
        }
    }
    return count;
}

现在这段代码的时间复杂度爆棚了。我在编写有效的解决方案时哪里出错了?

【问题讨论】:

    标签: c++ stl time-complexity c++14 complexity-theory


    【解决方案1】:

    现在这段代码的时间复杂度爆炸了。在编写有效的解决方案时我哪里出错了?

    您不应该将字符串转换为数字,因为它可能太长而无法放入 32-bit 甚至 64-bit 整数。相反,您应该意识到,我们只需要知道1s onesCount 的数量和整数字符串的长度size(我们假设根据问题陈述没有前导零)。让我们考虑一个例子。假设我们有一个号码11001。然后,步骤可以说明如下:

    1 1 0 0 1   subtract rightmost bit because it's 1  
        |
        v         
    1 1 0 0 0   right shift because rightmost 0  
        |
        V
    0 1 1 0 0   right shift because rightmost 0 
        |
        v
    0 0 1 1 0   right shift because rightmost 0 
        |
        v
    0 0 0 1 1   subtract rightmost bit 1
        |
        v
    0 0 0 1 0   right shift because rightmost 0 
        |
        V  
    0 0 0 0 1   subtract rightmost bit 1
        |
        V
    0 0 0 0 0   Complete.    
    

    所以,如您所见,如果最右边的数字是0(并且左边还有1s),那么需要一步才能移动到下一个右边数字。但是,如果最右边的数字是1(并且不是最后一个),那么我们需要2 步骤 - 将其无效并移动到下一个正确的数字。显然,如果最左边的数字是1,并且它是最后一个数字,那么它只是一步。

    但是,步骤数可以表示为:

    1. 如果一个数字是0,那么步数也是0
    2. 如果1 仅出现一次,则步数为字符串的size
    3. 如果出现更多1s,则总步数为onesCount * 2 + (size - onesCount - 1)。但是,这比第 2 节更通用,我们可以在这两种情况下使用它。

    代码

    uint32_t solveMe(std::string &number) {
        uint32_t onesCount = std::count(number.begin(), number.end(), '1');
        if (onesCount == 0) {
            return 0;
        }
    
        uint32_t numberSize = number.size();
    
        return onesCount * 2 + (numberSize - onesCount - 1);
    }
    

    更新

    正如@lucieon 所指出的,另一种看待这个问题的方式可以用下面的公式来描述:

    zerosCount + (onesCount-1)*2 + 1
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多