【发布时间】:2020-08-02 12:02:39
【问题描述】:
所以我在 LeetCode 上解决了一个问题,其中 Input: ["flower","flow","flight"] 输出:“fl”.. 所以我想出了一个解决方案,并在我的本地 Visual Studio 编译器上完美运行,但是当我将它提交到服务器时,服务器抱怨以下消息“第 924 行:字符 34:运行时错误:添加无符号偏移到 0x6030000000a0 溢出到 0x603000000080 (stl_vector.h) 摘要:UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/stl_vector.h :933:34"
为了进一步澄清问题,这是 LeetCode 上的问题链接 Longest Common Prefix 我的解决方案是
string longestCommonPrefix(vector<string> strs)
{
string temp;
int count = 0;
int new_count = 0;
string::iterator iter1;
string::iterator iter2;
for (int i = 0; i != strs.size(); ++i) {
if (i != str.size() - 1) {
cout << "if 1\n";
iter1 = strs[i].begin();
iter2 = strs[i + 1].begin();
while (iter1 != str[i].end() && iter2 != str[i + 1].end()) {
if (*iter1 == *iter2 ) {
temp.push_back(*iter1);
++count;
}
if (*iter1 != *iter2)
break;
++iter1;
++iter2;
}
}
if (i == str.size() - 1) {
iter1 = strs[i].begin();
iter2 = strs[i - 1].begin();
while (iter1 != str[i].end() && iter2 != str[i - 1].end()) {
if (*iter1 == *iter2 ) {
temp.push_back(*iter1);
++new_count;
}
if (*iter1 != *iter2)
break;
++iter1;
++iter2;
}
break;
}
i += 1;
}
new_count = min(count, new_count);
if ( new_count == 0) {
return "";
}
temp = string(temp.substr(0, new_count));
return temp;
}
【问题讨论】:
-
失败的测试用例在哪里?
-
我在遵循此代码时遇到了问题。您能否至少将
str重命名为strs之类的名称,以便更容易将其视为字符串向量,您能否在代码块之前用英文描述您的算法? -
那里有一个鬼鬼祟祟的
i += 1;,而你也在for循环中做++i......因为你检查i != str.size()有可能你过冲......恕我直言,这是一个简单的错字...因此应该关闭问题。 -
无论您是否得到错误答案,运行here 时代码都不会爆炸,因为您向我们展示了测试。那么那个测试是失败的案例吗?
-
如果您有导致问题的输入,那么您还可以使用硬编码的输入创建一个程序,并使用调试器捕获崩溃以查看它在您的代码中发生的时间和位置,并检查所有相关变量的值。您还可以使用调试器逐个语句逐句执行代码,以确保它完成您真正期望它执行的操作。