c++ - 为什么这会返回“NO”?
问题描述
我正在研究“HackerRank 面试准备工具包”,并且偶然发现了另一个用户的这个解决方案。解决方案不正确,HackerRank 将其视为“正确”,我想了解原因。
// find if there is a common substring
string twoStrings(string s1, string s2)
{
int n;
int m;
const char* char_array1;
const char* char_array2;
unordered_map<char, char> map;
n = s1.size();
m = s2.size();
char_array1 = s1.c_str();
char_array2 = s2.c_str();
for (int i = 0; i < n - 1; i++)
map[char_array1[i]] = char_array1[i + 1];
for (int i = 0; i < m; i++)
if (map[char_array2[i]] != 0)
return "YES";
return "NO";
}
我传入的值是:
beetroots & sandals
代码返回“NO”,这是不正确的,因为两个单词中都出现了“s”。
解决方案
为什么这会返回“NO”?
该函数返回"NO"
,因为填充的第一个循环map
不考虑 - 的最后一个字符,s1
因此在第二个for
开始之前,map
将包含b
, e
, t
,r
和的条目o
:
map['b'] = 'e'
map['e'] = 't'
map['t'] = 's'
map['r'] = 'o'
map['o'] = 't'
我怀疑这段代码的作者认为basic_string::size()
返回基础字符数组中的元素数(即包括 null-terminator \0
) - 但实际上返回字符数(嗯,元素数,不一定是字符,具体取决于关于正在使用的编码)。
该函数本身是完全错误的,因为它不执行任何与检查公共子字符串相关的逻辑 - 它只是检查是否s2
存在任何字符s1
(除了 的最后一个字符s1
)。
解决方案不正确,HackerRank 将其视为“正确”,我想了解原因。
我能想到的唯一原因是 HackerRank 使用了一组不充分的测试用例——这很不寻常,因为它们往往擅长这种事情。
推荐阅读
- bash - linux bash变量根据范围产生2个不同的值?
- c - 预处理器存储的宏定义
- lua - 如何在 roblox lua 中找到角色部分的方向?
- javascript - 我将如何使用下划线 js 将嵌套 json 转换为扁平 json
- symfony - 在 Symfony 的 CheckboxType 中将字符串填充为布尔值
- php - 从 PHP 应用程序运行并行 CLI 进程的最有效方法
- python - Sqlite 日期时间与 unix 时间戳的比较
- javascript - 如何格式化 Javascript Fetch API 输出
- python - 使用 matplotlib 正确旋转和对齐标签
- python - 基于列条件的前向填充熊猫