【问题标题】:count uppercase chars in string recursively递归计算字符串中的大写字符
【发布时间】:2013-07-21 13:08:19
【问题描述】:

我必须解决一个练习,计算一个字符串中的所有大写字符 - 递归 - 无论如何我认为我可能已经找到了一个解决方案 - 但它不会工作...... 或许你能帮我?谢谢!

public static int CountCapitals(String s) {
    int counter = 0;
    // if (Character.isUpperCase(s.charAt(0)))counter+=1;
    if (s.length() == 0)
        return counter;
    if (s.length() == 1 && s.charAt(0) < 65 && s.charAt(0) > 90)
        return 0;
    if (s.charAt(0) < 'A' && s.charAt(0) > 'Z') {
        return CountCapitals(s.substring(1));
    } 
    if (s.charAt(0) >= 'A' && s.charAt(0) <= 'Z')
        counter++;
        return CountCapitals(s.substring(1));
}

【问题讨论】:

  • 欢迎来到 Stackoverflow!你的代码遇到了什么问题?请更详细地解释您手头的具体问题。
  • 您应该使用tour

标签: java string count char uppercase


【解决方案1】:

您的代码的问题在于counter 的使用:每个调用级别都有自己的counter,最初设置为零。底部的++ 运算符无效。

您需要根据上一次调用的结果计算本次调用的结果。您的基本情况(即s.length() == 0)很好;其余代码需要更改,以便在第一个字母非大写时返回 CountCapitals(s.substring(1));当第一个字母大写时,您的函数应返回1 + CountCapitals(s.substring(1))

【讨论】:

  • 这是正确的解决方案。此外,如果在练习中允许,我强烈建议使用 Java 内置的 isUpperCase() 方法,以避免在边界条件下击中自己的脚;但如果这是练习,那就这样吧。 ;)
【解决方案2】:

需要考虑字符串长度为1且唯一字符为大写的情况(此时应返回1)。

您还需要将计数器作为参数传递,而不是期望它“继承”到其他函数调用中。

【讨论】:

    【解决方案3】:

    这个递归应该做你想做的事:

    public static int countCapitals(String s) {
        if (s.length() == 0) return 0;
        int cap = Character.isUpperCase(s.charAt(0)) ? 1 : 0;
        return countCapitals(s.substring(1)) + cap;
    }
    

    如果这不是家庭作业,您可以尝试一种迭代方法,它的速度大约快 5-10 倍:

    public static int countCapitals(String s) {
        int count = 0;
        for (int idx = 0; idx < s.length(); idx++) {
            if (Character.isUpperCase(s.charAt(idx))) {
                count++;
            }
        }
        return count;
    }
    

    【讨论】:

      【解决方案4】:

      您实际上并不需要使用counter 变量来跟踪大写字母的数量。相反,您可以只使用递归调用本身来跟踪总数:

      public static int CountCapitals(String s) 
      {
          if (s.length() == 1)
              return (Character.isUpperCase(s.charAt(0)) ? 1 : 0);
          else 
              return CountCapitals(s.substring(1)) + 
                     (Character.isUpperCase(s.charAt(0)) ? 1 : 0);    
      }
      

      如果这是用于分配并且您必须使用 ASCII 值,那很好,但如果不是,您真的应该只使用Character.isUpperCase(char c)。如果你不熟悉条件运算符,它的定义如下:

      if(someExpression == true)
      {
        //output 1
      }
      else
      {
        //output 0
      }
      

      简洁地表示为:

      (someExpression == true) ? 1 : 0
      


      注意:
      在您的示例中,counter 在每个方法调用开始时设置为 0,这就是它不起作用的原因。如果您真的想要使用counter,请将其作为参数传递给方法,并在每次方法调用时更新参数。当您到达String 的末尾时,只需返回参数即可。

      【讨论】:

        【解决方案5】:

        你试试这个

        公共类 HelloWorld{

        public static int isUpperCase(String str){
        
            if(str.length()==0) return 0;
        
            boolean check =Character.isUpperCase(str.charAt(0));
        
            if(check){
        
              return  isUpperCase(str.substring(1))+1;
            }
        
            return isUpperCase(str.substring(1));
                 
         }
        
        
        
           public static void main(String []args){
        
            String n= "FSAsdsadASdcCa";
            System.out.println(isUpperCase("FSAsdsadASdcCa"));
          
         }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-15
          • 1970-01-01
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2021-09-01
          • 2013-08-10
          • 2020-08-28
          相关资源
          最近更新 更多