【发布时间】:2022-01-20 12:38:54
【问题描述】:
在编译问题时:
Geeks For Geeks: First Repeating Element 在 Windows 操作系统上我注意到我的解决方案没有得到任何输出。但是当我在 Linux 操作系统和在线编译器上编译相同的代码时,它运行得非常好,没有产生任何错误。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
int arr[n];
for(int i=0; i <n; i++) {
cin>>arr[i];
}
int size= 1e6+1; // WA on windows
int A[size];
int min_index=INT_MAX;
for(int i=0; i<size; i++) {
A[i]=-1;
}
for(int i=0; i<n; i++) {
if(A[arr[i]]!=-1)
min_index=min(min_index, A[arr[i]]);
else
A[arr[i]]=i;
}
if(min_index==INT_MAX)
cout<<"-1";
else
cout<< min_index+1;
return 0;
}
示例测试用例:
7
1 5 3 4 3 5 6
预期输出:
2
Windows 上的输出: Screenshot
Linux 上的输出: Screenshot
第 14 行代码的解释:
我创建了一个大小为1e6+1 的数组A 以在其arr[i]th 索引上存储值i。
数组A 早先被初始化为值-1。它运行n 次数,变量min_index 存储数组arr 中重复次数最少的索引。
在初始化数组int size = 10 的较小值并使用非常小的测试用例后(arr[i] 的最大值也小于A 的大小;我意识到该程序在 Windows 中完美运行。
据我了解,Windows 在初始化如此大长度的数组时可能会遇到一些问题(如果我错了,请纠正我)。但是为什么在 Linux 的情况下不一样呢?
【问题讨论】:
-
开始:Why should I not #include <bits/stdc++.h>? 继续:Why aren't variable-length arrays part of the C++ standard? 虽然
using namespace std;是a bad habit,但对于小而简单的示例通常被认为是可以的。 -
最后:不要将所谓的“竞赛”或“在线评委”网站用作任何类型的教学或学习资源。它们不是,并且可能对您的正常学习有害。获取some good books 并参加课程以正确学习 C++(和一般编程)。
-
考虑到您的 VLA(可变长度数组)
A有四百万字节大,我真的很惊讶该程序甚至可以在 Windows 上运行。 Windows 上的默认堆栈大小(和局部变量通常存储在堆栈中)只有一个 MiB。1e+1也是一个 浮点 值(double类型)并且不比1000001更具可读性。 -
或者问题在于 VLA
A真的太大而您的程序崩溃?这意味着您需要学习这些网站未教授的其他内容:调试。 -
int A[size];否。以下是正确的 C++ 代码:std::vector<int> A(size);。其次,如前所述,使用 C++ 书籍来学习 C++。如果你这样做了,你就不会犯错,因为没有一本好的 C++ 书籍显示使用运行时变量声明数组。