我应该如何编写 MU 谜题的规则 3?

问题描述 投票:0回答:1

我正在看 godel escher bach 的 MU 谜题,我正在尝试实施一组规则。

规则是

规则 1:如果你的字符串以 I 结尾,你可以在末尾添加一个 U:x I → x IU

规则 2:如果字符串以 M 开头,则可以将 M 后面的内容加倍:M x → M x x

规则 3:如果字符串中有 III,则可以将其替换为 U:x III y → x U y

规则 4:如果字符串中有 UU,则可以将其完全删除:x UU y → x y

我从所有这些规则中得到了结果,但是我不相信我的规则 3 的代码有效。

我的字符串输入是“MIIII”

我得到输出:[MIIIIU,MIIIIIIIII,MUI,MIU]

我正在寻找哪个输出。

但是我相信我的编码方式并不能正确替换 U。

我想如果我的输入是“MIIIIII”我相信我应该得到结果MUU如果我错了请纠正我。

但是我的代码返回 MU,因为我使用 split 并向字符串添加一个 U,但是当我认为它应该返回两个 U 时,这会将所有 6 个 I 替换为 U。

我的这条规则的代码是

if(s.contains ("III")){

        String parts[] = s.split("III");// split at III and handle empty string

        String x = parts[0]; // Prefix;
        String y = parts[1]; //suffix

        list.add(x+"U"+y);
        list.add(x+y+"U");
    }
}

任何有关如何更好地解决此问题的建议将不胜感激。

谢谢

java eclipse string split
1个回答
0
投票

任何有关如何更好地解决此问题的建议将不胜感激。

这个问题很老了,但对于其他有类似问题的人来说,迟到的答案可能比没有好。

您使用

parts = s.split("III")
然后使用 parts[0] 和 parts[1] 的代码依赖于一些不成立的假设:

  1. 假设“III”之间和周围的子字符串将包含在 split() 的结果中,即使它们的长度为零。 s = "MIIIIII" 的情况并非如此,因为前三个 I 和后三个都被视为分隔符。因此,虽然您可能期望得到 ["M", "", ""] 作为结果,但文档显示“因此,尾随空字符串不包含在结果数组中。”所以结果实际上只是一部分:parts[0] = "M"。零件[1]不存在。 split() 对于这项任务来说确实不可靠。

  2. 假设“III”出现的次数是固定的。您的 list.add(...) 代码似乎期望您应该在两个地方用“U”替换“III”。但您的输入字符串可能只有一个“III”,或三个,等等。

相反,循环遍历字符串中出现的“III”,将每个出现的位置替换为“U”:

int nextIII = s.indexOf("III");
while (nextIII > -1) {
   list.add(s.substring(0, nextIII) + "U" + s.substring(nextIII + 3));
   nextIII = s.indexOf("III");
}
© www.soinside.com 2019 - 2024. All rights reserved.