【问题标题】:What happens when if statement goes true (in this code)?当 if 语句为真(在此代码中)时会发生什么?
【发布时间】:2020-03-21 18:38:12
【问题描述】:

codingbat.com 中存在问题,您应该从原始字符串中删除“yak”子字符串。他们提供了一个解决方案,我无法理解当 if 语句为真时会发生什么!

public String stringYak(String str) {
  String result = "";

  for (int i=0; i<str.length(); i++) {
    // Look for i starting a "yak" -- advance i in that case
    if (i+2<str.length() && str.charAt(i)=='y' && str.charAt(i+2)=='k') {
      i =  i + 2;
    } else { // Otherwise do the normal append
      result = result + str.charAt(i);
    }
  }

  return result;
}

它只是将 i 加起来 2 和什么?当它附加到结果字符串时?

问题链接: https://codingbat.com/prob/p126212

【问题讨论】:

  • 有什么问题? if 语句是 true 当找到的子字符串是“牦牛”时,它会在 i 上加 +2 以跳过该单词并继续循环以查找更多牦牛。
  • 应该也是检查字母a吧

标签: java if-statement logical-operators


【解决方案1】:

提供的解决方案检查输入字符串中的所有单个字符。对于这个i 是检查字符的当前索引。当当前 char 不是 y 并且 (i+2) 字符不是 k 时,当前 char 索引将前移 1 个位置。

例子:

yakpak
012345
i

所以在第一次迭代中,i 处的字符是yi+2k,所以我们必须跳过 3 个字符。请记住,i 每次都提前 1。所以我必须再增加2。在这次迭代之后i 就在这里

yakpak
012345
   i

所以现在当前字符不是y,这个字符将被添加到结果字符串中。

但在 Java 中它更简单,因为此功能是使用正则表达式内置的:

public String stringYak(String str) {
  return str.replaceAll("y.k","");
}

. 表示每个字符。

【讨论】:

  • 很好的解释和解决这个问题的优雅替代方案
  • 所以它跳过了 for 循环中的“k”。感谢您的解释和出色的替代解决方案。 (我还是不能投票!:)))
【解决方案2】:

如果i 指向y 并且有k 向下两个位置,那么它想跳过完整的y*k 子字符串,所以它将2 添加到i 所以@987654327 @ 现在指的是k。当循环继续时,i++ 将跳过 k,因此实际上,整个 3 字母 y*k 子字符串已被跳过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多