这两天做leetcode出现一件怪事:同样的测试数据,我将代码放在编译器里跑结果符合预期,但是!原封不动地复制到leetcode去提交,却输出了一个莫名其妙的结果。
先给出最后的解决方法:
将所有代码放在题目给出的class里提交,即避免出现以下情况:
int sum = 0;
void Cal(vector<int>& sub, int k);
//具体实现不表
void Sub(vector<int>& nums, vector<int>& sub, int start, int k);
//具体实现不表
class Solution {
public:
int sumOfPowers(vector<int>& nums, int k) {
//具体实现不表
}
};
而全部放进class里,就和编译器输出一致啦:
class Solution {
private:
int sum = 0;
void Cal(vector<int>& sub, int k);
//具体实现不表
void Sub(vector<int>& nums, vector<int>& sub, int start, int k);
//具体实现不表
public:
int sumOfPowers(vector<int>& nums, int k) {
//具体实现不表
}
};
PS:在求解这问题的过程中,我请教了一位大牛朋友,他当时提出了其他的一些可能性,也一并收录,供大家参考:
“我没有做过leetcode,这种情况我听过,很正常
这往往是你不遵守语言标准导致的”
example1.
我说一个常见的例子,int类型的位宽在不用编译器和不同机器上位宽不一样
C99的标准规定int类型的位宽大于等于16
但大多数机器上其实是32或者64,其实和long是一样的
因此使用int的时候不能依赖高于16位的位宽
保证按照标准的最低要求程序可以运行
example2.
再比如C99要求main函数空参数必须是void,返回必须是int,但是其他编译器如msvc会宽恕其他的返回类型和语法
example3.
再比如#programed once语法是msvc自创的,标准上没有,其他编译器也不保证实现
~希望对你有启发~