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

初学者编程练习(Java):递归计算字符串(.equals()?)中的子字符串实例

池赞
2023-03-14

我正在通过Codingbat上的一系列在线练习进行学习。为了我自己的娱乐。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回所传递字符串中字符“x”的频率:

       public int countX(String str) {
/*Given a string, compute recursively (no loops) the number of lowercase 'x' 
chars in the string.*/
            if (str.length()< 1){
                return 0;
            }else if (str.charAt(0) == 'x'){
                return countX(str.substring(1)) + 1;
            }else{
                return countX(str.substring(1));
            }
}

根据Codingbat网站,这工作得很好。

下一个练习是计算字符串中子字符串“hi”的频率。我尝试调整我以前的方法,使用substring()而不是charAt()

       public int countHi(String str) {
/*Given a string, compute recursively (no loops) the number of times lowercase 
"hi" appears in the string.*/
              if (str.length()< 2){
                return 0;
            }else if (str.substring(0, 1).equals("hi")){
                return countHi(str.substring(1)) + 1;
            }else{
                return countHi(str.substring(1));
            }
}

但是,它始终返回0。看起来像是测试条件

 }else if (str.substring(0, 1).equals("hi")){

从未见过,但我不知道为什么。希望有人能帮忙!

编辑:

正如Steve和JustinKSU指出的,我返回的是单个字符的子字符串。我认为substring()方法中的索引号引用字符的索引,就好像它们存储在一个数组中一样(其中0将是第一个字符,1秒等等)。考虑这个问题似乎更好的方法是substring()索引表示字符串中字符分隔符的计数,从第一个字符前面的分隔符开始(这样子字符串(0,1)封装第一个字符)。

共有3个答案

季小云
2023-03-14

可以避免使用subString()并消除复杂性。

public static int countHi(String str){
      if(str.length() > 0){
         if(str.contains("hi")){
           return  countHi(str.replaceFirst("hi","")) + 1;
         }  
      }
     return 0;
}
欧阳哲
2023-03-14

你在找什么

str.substring(0, 2)
宋志学
2023-03-14

str.substring(0,1)
将只返回一个字符,因此它永远不会与包含两个字符的“hi”匹配。你应该试试

str.substring(0,2)

 类似资料:
  • 我应该编写一个简单的方法,返回给定数量的给定字符串,用逗号分隔(最后没有逗号),并使用递归。如果计数少于两个,则返回空字符串“”。 如果我把s=cat,count=5,我会得到所需的短一个。我不知道该怎么做,在这里得到适当数量的重复,而不在末尾加逗号。 编辑:显然我没有沟通,如果计数为2或更少,则该方法应该返回一个空字符串。抱歉这里不够清晰。

  • 这个练习中,我会向你展示可能是最快的字符串搜索算法之一,并且将它与bstrlib.c中现有的binstr比较。binstr的文档说它仅仅使用了“暴力搜索”的字符串算法来寻找第一个实例。我所实现的函数使用Boyer-Moore-Horspool(BMH)算法,如果你分析理论时间的话,一般认为它会更快。你也会看到,如果我的实现没有任何缺陷,BMH的实际时间会比binstr简单的暴力搜索更糟。 这个练习

  • 问题内容: 我正在做一个作业,在该作业中,我必须编写程序以读取用户的字符串,并打印出字符串中出现次数的字母。 例如,“ Hello world”应该打印出“ h = 1 e = 1 l = 3 o = 2 …等”,但是我只写“ hello world”和字母总数。 我不能使用hashmap函数,只能使用数组。有人可以给我一两个提示,提示如何从下面的书面代码继续进行操作以获得我的首选功能?我不完全了

  • 我正在学习如何通过OCA考试,并坚持这个java字符串池的概念。 考虑以下几点: 和在字符串中是相同的,在对象中也是相同的,因为它是相同的字符串文本,所以JVM在编译时将字符串池和。 现在,是在运行时计算的,因此应该返回一个新字符串。因此,应该为false,但事实并非如此。为什么? 我的一个理论是方法首先检查是否有空白需要删除,如果没有,则简单返回本身。这可以解释为什么s1==s3,但我不确定。

  • 问题内容: 为什么以下算法对我来说不停止?(str是我要搜索的字符串,findStr是我要寻找的字符串) 问题答案: 最后一行造成了问题。永远不会为-1,所以会有无限循环。可以通过将代码的最后一行移到if块中来解决此问题。

  • 本文向大家介绍替换Java字符串中的子字符串,包括了替换Java字符串中的子字符串的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的字符串。 我们想将子字符串“ Dead”替换为“ Alive”。为此,让我们使用以下逻辑。在这里,我们使用了while循环,并在其中找到了要替换的子字符串的索引。这样,我们一个接一个地替换了整个子字符串。 以下是替换子字符串的完整示例。 示例 输出结果