我要做什么
返回一个整数,该整数表示为了使数组连续(首先对其进行排序),我需要添加的数字数。
示例输入和输出
输入:[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,但仍然无法正常工作。
谢谢您的帮助。
答案 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;
}
...但是如果您只是想弄清楚发生了什么,我认为第一个版本可能是最简单的版本。