所以我在www.codility.com上参加了这个名为'permMissingElement'的练习课,这是我的代码:
#include <iostream>
using namespace std;
int solution(vector<int> &A)
{
int N = A.size();
double Nf = double(N);
int n;
double missingf;
int missing;
double sumN1, sumN2;
int sum = 0;
double sumf;
double two = 2.0;
for (n = 0; n < N; n++)
{
sum = sum + A[n];
}
sumf = double(sum);
sumN1 = (Nf+double(1.0))/double(2.0);
sumN2 = sumN1*(Nf+double(2.0));
missingf = sumN2 - sumf;
missing = int(missingf);
return missing;
}
现在,这是问题所在。我的算法有效,但由于某些原因我无法弄清楚,给出错误的答案&#34; large&#34; N的值(课程中N最多可达100,000)。
无论如何,我最初使用所有整数编写程序,然后意识到我可能因此而得到溢出,所以我将它们改为双打,但我仍然得到大的N值的错误答案...为什么是什么?
由于
答案 0 :(得分:1)
双精度是浮点数,这意味着您将失去精度,尤其是对于大数字。而不是使用int
使用其他整数类型,例如long
或long long
。
C ++标准没有为每种类型指定确切的大小,但int
至少为16位,long
至少为32位且long long
至少64位。
检查此问题以获取更多指示:size of int, long, etc
答案 1 :(得分:1)
你有趣的方法,我使用以下算法在php中解决了同样的问题,将每个数组值解释为索引,然后反转该值。最后一个值> 0的位置是缺失的,它仍然以O(n)运行。 这样你就可以避免添加大数字的溢出,因为你不必添加任何东西。
error_reporting(0);
$s = count($A);
for ($i=0; $i<$s; $i++)
{
$n = abs($A[$i])-1;
$A[$n]*=(-1);
}
for ($i=0; $i<$s; $i++)
{
if ($A[$i]>0)
return $i+1;
}
return $s+1;