对于非常大的输入,缺少和重复 1..n 的数字数组.使用1..n系列特性的解决方案.溢出问题

Missing and repeating number array from 1...n for very large inputs. Solution using properties of 1...n series. Overflow issues

本文关键字:使用 数字 数组 系列 溢出 出问题 解决方案 非常 于非常 输入      更新时间:2023-10-16

这是同一网站为 https://www.interviewbit.com/problems/repeat-and-missing-number-array/提供的代码:

vector<int> repeatedNumber(const vector<int> &V) {
long long sum = 0;
long long squareSum = 0;
long long temp;
for (int i = 0; i < V.size(); i++) {
temp = V[i];
sum += temp;
sum -= (i + 1);
squareSum += (temp * temp);
squareSum -= ((long long)(i + 1) * (long long)(i + 1));
}
// sum = A - B
// squareSum = A^2 - B^2 = (A - B)(A + B)
// squareSum / sum = A + B
squareSum /= sum;
// Now we have A + B and A - B. Lets figure out A and B now. 
int A = (int) ((sum + squareSum) / 2);
int B = squareSum - A;
vector<int> ret;
ret.push_back(A);
ret.push_back(B);
return ret;
}

现在,我编写了类似的代码,但没有类型转换,它为较大的输入返回错误。谁能解释一下类型转换如何解决溢出问题?

另外,我看到了这个问题的XOR方法,但不知道位操作问题。如果有人可以帮助我提供一些链接/资源来处理使用位操作方法处理问题,那就太好了!

感谢您阅读我的问题并想提供帮助!干杯!

(i + 1) * (i + 1)将以int算术进行评估,并有可能溢出,其行为尚未定义

写作

((long long)(i + 1) * (long long)(i + 1)); 

是消除这种影响的冗长方法;你可以使用更清晰的

(i + 1LL) * (i + 1)

相反,这会导致其他术语的转换。