当前位置: 首页 > 知识库问答 >
问题:

编码Bat字符串挑战测试失败

段兴为
2023-03-14
public int countYZ(String str) {
  int count = 0;
  for(int i = 0;i<str.length();i++)
    if((str.charAt(i)=='y'||str.charAt(i)=='z')&&!(Character.isLetter(i+1)))
        count++;
  return count;
}

此代码未通过此标准的测试:给定一个字符串,计算以“y”或“z”结尾的单词数——因此“重”中的“y”和“fez”中的'z”计数,而不是“黄色”中的‘y’(不区分大小写)。如果一个单词后面没有一个字母,我们会说一个y或z在单词的末尾。(注意:Character.islet(char)测试char是否为字母。)

我用手跟踪它,但似乎不明白为什么它在许多测试中都不工作。例如,在“day fyyyz”中,它输出5,但它应该返回2。感谢帮助!

共有3个答案

甄永年
2023-03-14

这是一个很容易用正则表达式解决的问题:

  String str = "day fyyyz provaz provy drad";
  Matcher matcher = Pattern.compile("(?i)\\b\\w+[zy]\\b").matcher(str);
  int i = 0;
  while (matcher.find()) {
    System.out.println(matcher.group());
    i++;
  }
  System.out.println("found " + i);

此代码将输出:

day
fyyyz
provaz
provy
found 4

这个regex (?i)\\b\\w [zy]\\b表示:

  • (? i)启用不区分大小写的匹配
  • \b匹配单词边界
  • \w匹配一个或多个单词字符(等于[a-zA-Z0-9_])
  • [zy]匹配下面列表中存在的单个字符[zy]
  • \b匹配单词边界

https://regex101.com/r/tLMobI/1

龙新荣
2023-03-14

您的函数是返回字符串中yz字符的总数,而不是以yz结尾的字数。\\W是一个正则表达式令牌,用于针对字符串中的任何非单词字符。

public int countYZ(String str) {
    String[] words = str.split("\\W");
    int tally = 0;

    for (String w : words)
        tally += (w.endsWith("y") || w.endsWith("z")) ? 1 : 0;

    return tally;
}
古起运
2023-03-14

需要考虑的两件事:

> < li>

正如UnholySheep指出的那样,< code > character . is letter(I 1)不检查字符串中的第< code>i 1个字符。你需要使用:

Character.isLetter(str.charAt(i+1))

但是,只需更改该值即可生成索引 OutOfBoundsException,因为如果字符串以 yz 结尾,则会溢出字符串的末尾。因此,将条件的第二位更改为

!(i+1 != str.length() && Character.isLetter(str.charAt(i+1)))

这也计算字符串末尾的 yz

当然,这可以写成:

i+1 == str.length() || !Character.isLetter(str.charAt(i+1))

这样就不那么尴尬了。

整体状况:

if((str.charAt(i) == 'y' || str.charAt(i) == 'z')
    && (i+1 == str.length() || !Character.isLetter(str.charAt(i+1)))

如果您想使其不区分大小写,请在与yz进行比较之前使用Character.toLowerCase(str.charAt(i))

 类似资料:
  • 问题内容: 我有以下提供商列表(俄语): 这些显然是在unicode中。以前,要执行SQL SELECT,我正在做: 现在,由于列表项使用的是unicode,因此我遇到了。 我将如何正确执行此sql语句? 问题答案: 您不应该用来在sql查询中包含值。改用sql参数: 原始清单在哪里。 想法是使用与列表中提供者数量匹配的SQL参数语法,通过测试生成SQL查询:对于两个提供者的列表。是的,MySQL

  • 问题:返回给定字符串的一个版本,其中对于字符串中的每个星号(),其左右两侧的星号和字符都消失了。所以“abcd”产生“ad”,而“abcd”也产生“ad”。例如starOut(“abcd”)→ “ad”开始(“abcd”)→ “ad”starOut(“smeilly”)→ “傻” 我知道网上有答案,但我不想复制它们。我已经开始使用它的大部分内容,但不知道如何去掉空格并转换回字符串?如果你们有更好的

  • 这个程序的目的是得到一个像“1256”这样的长变量,然后逐个数字相加,直到剩下一个个位整数。所以,,返回。 当我尝试验证时,它会给出错误: com.google.challenges.中找不到参数(int)的公共静态方法答案 有人能帮我理解这个错误的含义以及如何修复它吗?

  • CodingBat中的给定任务sameEnds: 给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。 我的解决方案通过了所有测试,除了一个^: 这里有什么问题?我怎样才能修复它?

  • 给定CodingBat中的任务maxBlock: 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我的解决方案通过了所有测试,除了一个:

  • 这个问题要求在键盘上键入字符串所需的总时间,用一个手指表示为二维字符矩阵。 输入: 第一行包含n和m作为输入,表示键盘矩阵的维数 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 说明:手指最初位于键盘的第一个符号,因此按下该键所需的时间为0。之后,新键位于1,1,因此总时间为|1-0||1-0|即2。现在第三个键位于位置1,2,因此移动到该键的总时间为|2-1||