为啥这会返回“NO”?

Posted

技术标签:

【中文标题】为啥这会返回“NO”?【英文标题】:Why is this returning "NO"?为什么这会返回“NO”? 【发布时间】:2020-05-06 04:40:44 【问题描述】:

我正在研究“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”。

【问题讨论】:

我猜是因为 HackerRank 上的测试集不够强大。 HackerRank 上有指向它的链接吗? 我猜当第一个字符串中只有最后一个符号与第二个字符串中的一个匹配时,他们没有测试用例,并且此函数仅因此而失败。 【参考方案1】:

为什么返回“NO”?

该函数返回"NO",因为填充map 的第一个循环不考虑s1 的最后一个字符 - 所以在第二个for 开始之前,map 将包含b 的条目、etro

map['b'] = 'e'
map['e'] = 't'
map['t'] = 's'
map['r'] = 'o'
map['o'] = 't'

我怀疑这段代码的作者认为 basic_string::size() 返回底层字符数组中的元素数(即包括空终止符 \0) - 但实际上返回字符数(嗯,数字元素,根据使用的编码,不一定是字符)。

函数本身是完全错误的,因为它不执行任何与检查公共子字符串相关的逻辑——它只是检查s1 中是否存在s2 中的任何字符(s1 的最后一个字符除外)。

解决方案不正确,HackerRank 认为它是“正确的”,我想了解原因。

我能想到的唯一原因是 HackerRank 使用了一组不充分的测试用例——这很不寻常,因为他们往往擅长这种事情。

【讨论】:

实际上功能几乎是正确的,它们可以使用“子字符串”一个符号长度。因此,为了抓住这一点,他们需要创建一个非常具体的测试用例 “我怀疑这段代码的作者认为”我不这么认为,作者使用了n-1,因为他/她在赋值右侧使用了char_array1[i + 1]。虽然为什么这样做完全是个谜。 @Slava 是的,这就是我发现的,最后一个字符被省略了,我猜数据的值集只是被添加以允许有效的地图对象。我发现如果我通过并将n = s1.size()m = s2.size() 更改为length(),并将for 循环更新为for (int i = 0; i &lt; n; i++)for (int i = 0; i &lt; m+1; i++)。我认为它允许比较两个字符串。不过,我不知道为什么最后一个 if 语句 != 0 有效,我想我必须更多地研究地图。感谢各位大侠的帮助,如果我弄明白了会更新的。 等待实际大小和长度是一样的

以上是关于为啥这会返回“NO”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITextField becomeFirstResponder 返回 NO?

为啥 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?

为啥 [context save:&error] 返回 NO 并且错误为 nil?

为啥对 recv 的重叠调用会返回 ERROR_NO_MORE_ITEMS(259)?

为啥这会导致 oracle 错误? ORA-00907

为啥 (0 < 5 < 3) 返回 true?