【发布时间】:2021-04-21 14:16:21
【问题描述】:
我试图解决这个练习 我得到了 66% 我不明白为什么 你能帮忙吗?
练习是: 写一个函数:
int 解(向量 &A);
给定一个包含 N 个整数的数组 A,返回在 A 中没有出现的最小正整数(大于 0)。
例如,给定 A = [1, 3, 6, 4, 1, 2],函数应该返回 5。
给定 A = [1, 2, 3],函数应该返回 4。
给定 A = [−1, −3],函数应该返回 1。 我写的解决方案是:
#include <algorithm>
#include<cmath>
using namespace std;
int solution(vector<int> &A) {
if (A.size() == 0 || (A.size() == 1 && A.at(0) <= 0))
return 1;
if (A.size() == 1)
return A.at(0) + 1;
sort(A.begin(), A.end());
if (A.at(A.size() - 1) <= 0)
return 1;
auto ip = std::unique(A.begin(), A.end());
A.resize(distance(A.begin(), ip));
A.erase(remove_if(A.begin(), A.end(), [](const int i) { return i < 0; }),A.end());
if (A.at(0) != 1)
return 1;
if (A.size() == 1)
return (A.at(0) != 1 ? 1 : 2);
int i = 0;
for (; i < A.size(); ++i) {
if (A.at(i) != i + 1)
return A.at(i - 1) + 1;
}
return A.at(A.size()) + 1;
}
【问题讨论】:
-
逻辑大致在这里,你必须调试才能解决问题。编写单元测试和/或尝试查找产生错误输出的输入。
-
仅供参考
std::sort和adjacent_find将其设为 trivial and much shorter solution,无需调整大小、擦除、删除等。