在长度为n的序列中,其中n = 2k + 3,即有k个唯一数字出现两次,并且三个数字仅出现一次.
问题是:如何找到仅出现一次的三个唯一数字?
例如,在顺序1 1 2 6 3 6 5 7 7中,三个唯一数字是2 3 5.
注意:3 <= n <1e6,数字范围为1到2e9
内存限制:1000KB,这意味着我们无法存储整个序列.
方法我试过(内存限制超过)?
我初始化一个树,当读入一个数字时,我尝试将其从树中删除,如果remove返回false(未找到),我将它添加到树中.最后,树有三个数字.它工作,但内存限制超过.
我知道如何使用位操作找到一个或两个这样的数字.所以我想知道是否
我们可以找到三个使用相同的方法(或一些类似的方法)?
找到一个/两个数字的方法只出现一次:
如果只有一个数字出现一次,我们可以对序列应用XOR来找到它.
如果有两个,我们可以先对序列应用XOR,然后将序列分成2个部分,结果为1,然后再将XOR应用于2个部分,我们将找到答案.
给定未排序的正整数数组,找到最长子数组的长度,其中排序的元素是连续的.你能想到O(n)解决方案吗?
例:
{10,5,3,1,4,2,8,7},答案是5.
{4,5,1,5,7,6,8,4,1},答案是5.
对于第一个例子,子阵列{5,3,1,4,2}在排序时可以形成连续序列1,2,3,4,5,它们是最长的.
对于第二个例子,子阵列{5,7,6,8,4}是结果子阵列.
我可以想到一个方法,对于每个子阵列,检查(最大 - 最小+ 1)是否等于该子阵列的长度,如果为真,那么它是一个连续的子阵列.花费最长的.但它是O(n ^ 2)并且不能处理重复.
有人可以提供更好的方法吗?
class foo {
public:
friend ostream& operator << (ostream &os, const foo &f);
foo(int n) : a(n) {}
private:
vector <int> a;
};
ostream& operator << (ostream &os, const foo &f) {
for (int i = 0; i < f.a.size(); ++i)
os << f.a[i] << " ";
os << endl; // why is this line a must?
}
int main(void) {
foo f(2);
cout << f << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,如果标记的行被删除,会出现段错误,有人可以解释一下原因吗?
数组中的最小唯一编号定义为
min{v|v occurs only once in the array}
:例如,{1,4,1,2,3}的最小唯一编号为2.有没有比排序更好的方法?
我只是想不出以下代码.
int d = 5;
float f = 3.8f;
int ret = d*f;
Run Code Online (Sandbox Code Playgroud)
按照我的预期,退步是18,而不是19.为什么?
如何将一段代码作为参数传递给python?
我试过这样,但它没有用.
$ python3'print("hello world")'
无法打开文件'打印(你好':[Errno 2]没有这样的文件或目录