为什么我的计数器在应为0时却不能正常工作,而其他值> 0可以正常工作吗?

时间:2020-07-07 20:07:04

标签: c++ syntax

我要做什么
返回一个整数,该整数表示为了使数组连续(首先对其进行排序),我需要添加的数字数。

示例输入和输出
输入:[6、2、3、8]。
输出:3.
原因:将向量排序为[2、3、6、8]之后,我们需要3个数字才能使整个向量连续(需要将4、5、7加到数组中,因此返回3)。 / p>

我在哪里?
照顾了向量中1个整数的基本情况(返回0;无连续值)。
创建一个计数器,设置为0。
对向量进行排序,升序。
遍历向量,以检查:
如果右边的值与当前值!= 1之差,则将1加到计数器上。这意味着下一个数字不是连续的,因此我们需要一个数字。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>


int makeArrayConsecutive2(std::vector<int> statues) {
    
    if (statues.size() == 1) {
        return 0;
    }
    
    int counter = 0;
    std::sort(statues.begin(), statues.end());
    for (int i = 0; i < statues.size(); i++) {
        if (statues[i+1] - statues[i] != 1) {
            counter += 1;
        }
    }
    
    return counter;

}

那是什么问题?
我的测试用例中有4/5通过了 ,除了这一个

输入:[5,4,6] 预期:0 实际:1

我很难理解为什么这不适用于那种情况。如果其他所有方法都起作用,那么为什么只有这种情况呢?我怀疑它是索引问题,但是我尝试从索引中使用-1,但仍然无法正常工作。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这些是更正的行:

   for (int i = 0; i < statues.size()-1; i++) {
        if (statues[i+1] - statues[i] != 1) {
            counter += statues[i+1] - statues[i] -1;
        }
    }

答案 1 :(得分:2)

标准库已经提供了std::adjacent_difference,它可以为您完成绝大多数工作:

#include <numeric>
#include <iostream>
#include <vector>
#include <algorithm>

int makeArrayConsecutive(std::vector<int> input)
{
    std::sort(input.begin(), input.end());
    std::vector<int> diffs;
    std::adjacent_difference(input.begin(), input.end(), std::back_inserter(diffs));
    std::transform(diffs.begin(), diffs.end(), diffs.begin(), [](int a) { return a - 1; });
    int result = std::accumulate(diffs.begin() + 1, diffs.end(), 0);
    return result;
}

int main()
{
    std::cout << makeArrayConsecutive({ 6, 2, 3, 8 }) << "\n";
    std::cout << makeArrayConsecutive({ 5, 4, 6 });
}

结果(符合预期):

3
0

注意:为了清楚起见,我将每个操作都分开了。您可以(例如)通过使用带有std::transform的仿函数来轻松消除std::accumulate

int makeArrayConsecutive(std::vector<int> input)
{
    std::sort(input.begin(), input.end());
    std::vector<int> diffs;
    std::adjacent_difference(input.begin(), input.end(), std::back_inserter(diffs));
    int result = std::accumulate(diffs.begin() + 1, diffs.end(),
                                 0,
                                 [](int total, int val) { return total + val - 1; });
    return result;
}

同样,您可以通过将差异写回到输入数组中来消除差异的额外存储空间,如果输入很大,则可以大大减少存储需求:

int makeArrayConsecutive(std::vector<int> input)
{
    std::sort(input.begin(), input.end());
    std::adjacent_difference(input.begin(), input.end(), input.begin());
    int result = std::accumulate(input.begin() + 1, input.end(),
                                 0,
                                 [](int total, int val) { return total + val - 1; });
    return result;
}

...但是如果您只是想弄清楚发生了什么,我认为第一个版本可能是最简单的版本。