【问题标题】:Use recursion to find a specific character followed by another specific character in a char[]使用递归在 char[] 中查找特定字符后跟另一个特定字符
【发布时间】:2019-09-11 19:07:10
【问题描述】:

希望使用递归返回 char 数组中 char ':' 后跟 char ')' 的次数。

public class Recursion {
public static int countSmiles(char[] numbers) {
        if (numbers.length == 0) return 0;
        if(String.valueOf(numbers[0])== ":" && String.valueOf(numbers[1])==")") return 1 + countSmiles(numbers[1]);
        return countSmiles(numbers[1]);
    }
public static void main (String[] args) {
        char[] s = {'n','g', ':' ,')', ':' ,')'};
        System.out.println(countSmiles(s));
    }
}

我希望输出为 2。

我能够使用字符串成功地做到这一点(见下文),但无法使用 char 数组做到这一点。

public static int countSmiles(String numbers) {
    if (numbers.length() == 0) return 0;
    if (numbers.charAt(0) == ':'&& numbers.charAt(1)==')') return 1 + countSmiles(numbers.substring(1));
    return countSmiles(numbers.substring(1));
}

【问题讨论】:

    标签: java arrays recursion char


    【解决方案1】:

    除了人们对Arrays.copyOfRange() 的评价之外,您还需要与String.equals() 而不是== 相等。

    工作代码:

    import java.util.Arrays;
    
    public class Main {
      public static int countSmiles(char[] numbers) {
            if (numbers.length == 0) return 0;
            if(String.valueOf(numbers[0]).equals(":") && String.valueOf(numbers[1]).equals(")")) {
                return 1 + countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length));
            }
    
            return countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length));
        }
      public static void main (String[] args) {
            char[] s = {'n','g', ':' ,')', ':' ,')'};
            System.out.println(countSmiles(s));
        }
    }
    

    【讨论】:

      【解决方案2】:

      numbers[1] 只是一个字符,而不是没有第一个字符的整个数组。为此,您可以使用Arrays.copyOfRange(numbers, 1, numbers.length)

      【讨论】:

        【解决方案3】:

        numbers[1] 会给你第二个字符,编译器会告诉你参数不正确,因为chars[] 是预期的,而你只是给它char。您需要做一个子数组 Arrays.copyOfRange 并将其传递给 countSmiles

        return countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length - 1));
        

        但是,对于更多元素,您需要保留到目前为止已跳过多少元素的计数器,并使用它而不是 1。

        【讨论】:

          【解决方案4】:

          首先,您的递归永远不会移动。

          • 如果没有指针,您应该如何扫描所有数组?
          • 你永远不会在java中使用equals比较字符串和==
          • 其次,您可以比较字符而无需再次转换为字符串

          public static int countSmiles(char[] numbers,int index) {

          if ( numbers.length-2 < index) return 0;
          
          if(numbers[index]==':' && numbers[index+1]==')')
          return 1 + countSmiles(numbers,index+1);
          
          return countSmiles(numbers,index+1);
          

          } //主类

                 public static void main (String[] args) {
                      char[] s = {'n','g', ':' ,')', ':' ,')','r','5'};
                      System.out.println(countSmiles(s,0));
                  }
          

          试试这个,它会运行。

          【讨论】:

            猜你喜欢
            • 2021-11-05
            • 2022-12-06
            • 2022-12-22
            • 2019-02-28
            • 2021-10-17
            • 1970-01-01
            • 2021-08-01
            • 2021-11-29
            • 1970-01-01
            相关资源
            最近更新 更多