编码蝙蝠字符串挑战是失败的测试

时间:2017-03-15 16:09:28

标签: java string

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;
}

此代码未通过此条件的测试:给定一个字符串,计算结束于&#39; y&#39;或者&#39; z&#39; - 所以&#39; y&#39; in&#34; heavy&#34;而且&#39; z&#39;在&#34; fez&#34;伯爵,但不是&#39; y&#39; in&#34; yellow&#34; (不区分大小写)。如果没有紧跟在它后面的字母,我们会说y或z位于单词的末尾。 (注意:Character.isLetter(char)测试char是否为字母。)

我手工跟踪它,似乎无法弄清楚为什么它不能用于许多测试。例如,在&#34; day fyyyz&#34;它输出5但它应该返回2.感谢帮助!

3 个答案:

答案 0 :(得分:1)

需要考虑两件事:

  1. 正如UnholySheep所指出的,Character.isLetter(i+1)没有检查字符串中的i+1字符。您需要使用:

    Character.isLetter(str.charAt(i+1))
    
  2. 但只是更改它会产生IndexOutOfBoundsException,因为如果字符串以yz结尾,则会超出字符串的结尾。因此,将条件的第二位更改为

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

    这也会计算字符串末尾的yz

    当然,这可以写成:

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

    这有点不太尴尬。

  3. 总体情况:

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

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

答案 1 :(得分:0)

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

  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

此正则表达式(?i)\\b\\w+[zy]\\b表示:

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

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

答案 2 :(得分:0)

您的函数返回字符串中yz字符的总数,而不是y或{{1}中结尾的字数}}。 z是一个正则表达式标记,用于定位字符串中的任何非单词字符。

\\W