查看: 6756| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

LeetCode 中的输出和我的本地输出结果不一致

🔗
fluu | 只看该作者 |倒序浏览
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
题目是 LeetCode 211: https://leetcode.com/problems/add-and-search-word-data-structure-design/description/
我提交代码之后,发现是第一个 test case 错误(下图中红色下划线处),正确答案为 true,而我输出了 false,如下图:

但是当我在本地 Visual Studio 里调试的时候,发现对于这个 test case 的输出却是 true


本人百思不得其解。。。特来求助
我的代码如下:
  1. #include <string>
  2. #include <unordered_map>
  3. using namespace std;

  4. struct TrieNode {
  5.         unordered_map<char, TrieNode*> next;
  6.         bool is_word;
  7.         TrieNode() : is_word(false) {}
  8. };

  9. class WordDictionary {
  10. public:
  11.         /** Initialize your data structure here. */
  12.         WordDictionary() {
  13.                 root = new TrieNode();
  14.         }

  15.         /** Adds a word into the data structure. */
  16.         void addWord(string word) {
  17.                 TrieNode* curr = root;
  18.                 for (char c : word) {
  19.                         if (curr->next.find(c) == curr->next.end()) {
  20.                                 curr->next[c] = new TrieNode();
  21.                         }
  22.                         curr = curr->next[c];
  23.                 }
  24.                 curr->is_word = true;
  25.         }

  26.         /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
  27.         bool search(string word) {
  28.                 TrieNode* node = dfs(word, 0, root);
  29.                 return node != NULL && node->is_word;
  30.         }
  31. private:
  32.         TrieNode * root;

  33.         TrieNode * dfs(string& target, int index, TrieNode* curr) {
  34.                 if (index == target.size()) {
  35.                         return curr;
  36.                 }
  37.                 char c = target[index];
  38.                 if (c == '.') {
  39.                         for (auto it = curr->next.begin(); it != curr->next.end(); ++it) {
  40.                                 TrieNode* found = dfs(target, index + 1, it->second);
  41.                                 if (found != NULL) {
  42.                                         return found;
  43.                                 }
  44.                         }
  45.                         return NULL;
  46.                 }
  47.                 auto it = curr->next.find(c);
  48.                 return it == curr->next.end() ? NULL : dfs(target, index + 1, it->second);
  49.         }
  50. };

  51. int main() {
  52.         WordDictionary wd;
  53.         bool r;

  54.         wd.addWord("ran");
  55.         wd.addWord("rune");
  56.         wd.addWord("runner");
  57.         wd.addWord("runs");
  58.         wd.addWord("add");
  59.         wd.addWord("adds");
  60.         wd.addWord("adder");
  61.         wd.addWord("addee");

  62.         r = wd.search("r.n");                // true
  63.         r = wd.search("ru.n.e");        // false
  64.         r = wd.search("add");                // true
  65.         r = wd.search("add.");                // true
  66.         r = wd.search("adde.");                // true
  67.         r = wd.search(".an.");                // false
  68.         r = wd.search("...s");                // true
  69.         r = wd.search("....e.");        // true
  70.         r = wd.search(".......");        // false
  71.         r = wd.search("..n.r");                // false

  72.         return 0;
  73. }
复制代码




评分

参与人数 1大米 +1 收起 理由
rainbowzyh + 1 加分贴每人仅限一次加分,多次加分取消+扣2.

查看全部评分


上一篇:23号到现在,刷了100多题了。
下一篇:刷题记录自我监督
推荐
shell32 2018-6-11 19:35:43 | 只看该作者
全局:
这个是因为你在遇到'.'的时候应该遍历那一层的所有node,但是你只选了一个,因为你用了unordered_map,所以实际上是随机选的,这就是为什么你在本地和leetcode上结果不一样。

在第46行的if里面加一个条件
  1. && found->is_word
复制代码



补充内容 (2018-6-11 22:00):
说是随机不太好,应该说是顺序不定

评分

参与人数 1大米 +10 收起 理由
fluu + 10 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
给你举个例子

["WordDictionary","addWord","addWord","search"]
[[],["ran"],["rune"], ["r.."]]

这个test case你代码过不了.

我不是特别懂c++, 我猜大概是因为你dfs吧.. 似乎是找没找到都返回了?
回复

使用道具 举报

🔗
 楼主| fluu 2018-6-11 10:54:21 | 只看该作者
全局:
肥宅快乐水 发表于 2018-6-10 20:28
给你举个例子

["WordDictionary","addWord","addWord","search"]

谢谢,但是你给的这个例子,我的代码在IDE里是可以输出正确的结果的(true),不知道你为什么说过不了呢?
回复

使用道具 举报

🔗
 楼主| fluu 2018-6-11 10:55:14 | 只看该作者
全局:
肥宅快乐水 发表于 2018-6-10 20:28
给你举个例子

["WordDictionary","addWord","addWord","search"]

没找到的话,dfs返回NULL,然后search就会返回false
回复

使用道具 举报

全局:
fluu 发表于 2018-6-11 10:54
谢谢,但是你给的这个例子,我的代码在IDE里是可以输出正确的结果的(true),不知道你为什么说过不了呢 ...

哦我这个是leetcode上过不了的, 你试试.

我没有ide, 没办法在这边帮你看.
回复

使用道具 举报

🔗
 楼主| fluu 2018-6-11 12:39:19 | 只看该作者
全局:
肥宅快乐水 发表于 2018-6-10 21:53
哦我这个是leetcode上过不了的, 你试试.

我没有ide, 没办法在这边帮你看.

好吧。。。我问的就是LC和本地IDE显示结果不一致
回复

使用道具 举报

全局:
fluu 发表于 2018-6-11 12:39
好吧。。。我问的就是LC和本地IDE显示结果不一致

我猜了一下大概有几个原因吧..

1. 你的unordered map的visit顺序是unordered, 也许你电脑上的刚好就先走ra, 但是lc那边先走ru.

2. 你回复的逻辑其实我不是特别懂, 可以解释一下嘛..? 你的dfs走到底没有找到的时候, 会回溯回来然后检查到下一个.位置上的character嘛?
回复

使用道具 举报

🔗
magicsets 2018-6-11 23:28:50 | 只看该作者
全局:
不能只是“百思”不得其解.. 要debug

第一步是切割输入从而在尽量简化的情况下重现错误,这个楼上已经指出来一个很好的case:
  1. ["WordDictionary","addWord","addWord","search"]
  2. [[],["ran"],["rune"], ["r.."]]
复制代码


然后在一些关键点上添加输出,看看是不是与期望值一致。

既然search返回的值不正确,那么先从这里入手,添加一点输出:
  1.     bool search(string word) {
  2.         TrieNode* node = dfs(word, 0, root);
  3.         std::cout << "node = " << node << "\n";
  4.         if (node != NULL) {
  5.           std::cout << "is word = " << node->is_word << "\n";
  6.         }
  7.         return node != NULL && node->is_word;
  8.     }
复制代码

在LeetCode上Run Code执行后,你会发现输出显示node不为NULL,但是is word是false

这里其实应该可以猜出来是什么问题了,就是上面楼层所提到的返回了一个非word节点(例如rune的前缀"run"匹配"r..",但是run并不是word节点)

当然如果没有想到这一点的话,可以进一步追索为什么会返回一个is_word = false的点,那就是打印递归过程:
  1.     TrieNode * dfs(string& target, int index, TrieNode* curr) {
  2.         if (index == target.size()) {
  3.             std::cout << "Returning!\n";
  4.             return curr;
  5.         }
  6.         char c = target[index];
  7.         if (c == '.') {
  8.             for (auto it = curr->next.begin(); it != curr->next.end(); ++it) {
  9.                 std::cout << std::string(index, ' ') << it->first << "\n";
  10.                 TrieNode* found = dfs(target, index + 1, it->second);
  11.                 if (found != NULL) {
  12.                     return found;
  13.                 }
  14.             }
  15.             return NULL;
  16.         }
  17.         auto it = curr->next.find(c);
  18.         std::cout << std::string(index, ' ') << it->first << "\n";
  19.         return it == curr->next.end() ? NULL : dfs(target, index + 1, it->second);
  20.     }
复制代码

Run Code执行后你会发现打印出来的是按r->u->n的顺序走并且返回的,这时候整个程序的执行过程以及问题所在应该就很直观了。

评分

参与人数 2大米 +15 收起 理由
fluu + 10 给你点个赞!
vegito2002 + 5 围观剑神

查看全部评分

回复

使用道具 举报

🔗
 楼主| fluu 2018-6-12 00:06:01 | 只看该作者
全局:
感谢楼上诸位高手
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表