【问题标题】:Getting a wrong output using arraylists使用 arraylists 得到错误的输出
【发布时间】:2019-09-29 02:59:23
【问题描述】:

挑战是找到一个数字,其各个数字乘以连续递增的幂并相加,等于初始数字。

例如:取89,分成8和9,然后8^1 + 9^2 = 89

static List<Integer> sumDigPow(int a, int b) { 
        List<Integer> eureka = new ArrayList<Integer>(0);
        List<String> digits = new ArrayList<String>();
        String num;
        int sum = 0, multi;

    for (int i=a; i<=b; i++) {
        num = String.valueOf(i);
        digits.add(num);

        for (int j=0; j<digits.size(); j++) {
                multi = (int)Math.pow(Integer.parseInt(digits.get(j)), j+1);
                sum += multi;
        }

        if (sum == i) eureka.add(i);

        sum = 0;
        digits.clear();
    }

    return eureka;
}

输入 1 和 100(范围),输出应该是 [1, 2, 3, 4, 5, 6, 7, 8, 9, 89],但我得到了所有的数字[1, 2 ... 100]。

我最近才开始学习 java,但似乎无法在代码中找到问题所在。任何提示将不胜感激。

【问题讨论】:

    标签: java arrays algorithm arraylist design-patterns


    【解决方案1】:

    您可以使用以下内容:

    static List<Integer> sumDigPow(int a, int b) {
        List<Integer> eureka = new ArrayList<Integer>(0);
        String num;
        int sum = 0, multi;
    
        for (int i = a; i <= b; i++) {
            num = String.valueOf(i);
            for (int j = 0; j < num.length(); j++) {
                multi = (int) Math.pow(Character.getNumericValue(num.charAt(j)), j + 1);
                sum += multi;
            }
    
            if (sum == i) {
                eureka.add(i);
            }
            sum = 0;
        }
        return eureka;
    }
    

    解释:

    1. 您没有检查号码的第二位。
    2. 循环遍历 String num 的每个字符。
    3. 不需要digits arraylist,你可以使用char的numeric值。

    【讨论】:

      【解决方案2】:

      问题是那些行:

      num = String.valueOf(i);
      digits.add(num);
      

      您没有将号码拆分为数字。您只是将整数放入digits 列表中。看这段代码:

      static List<Integer> sumDigPow(int a, int b) {
              List<Integer> eureka = new ArrayList<Integer>();
              List<String> digits;
              String num;
              int sum = 0, multi;
      
              for (int i = a; i <= b; i++) {
                  num = String.valueOf(i);
                  digits = Arrays.asList(num.split(""));
      
                  for (int j = 0; j < digits.size(); j++) {
                      multi = (int) Math.pow(Integer.parseInt(digits.get(j)), j + 1);
                      sum += multi;
                  }
      
                  if (sum == i) eureka.add(i);
      
                  sum = 0;
              }
      
              return eureka;
          }
      

      我只是使用Arrays.asList(num.split("")) 将您的字符串编号拆分为数字。它为a=1b=100 输出列表:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      89
      

      【讨论】:

      • 行得通,谢谢。我使用 arraylist 来存储数字,只是为了使用 .clear() 方法,但我认为没有必要。
      • 还有更多的优化可以做,但我尽量不修改你的代码:)
      【解决方案3】:

      使用char[] 将数字拆分为字符数组的数字(您只是将整个数字作为单个字符串添加到列表中,而不是单个数字):

      ...
          char[] digits;
      ...
          digits = String.valueOf(i).toCharArray();
      

      然后,如果您从每个 char 数字中减去 '0',您将自动获得该数字的实际 int 值,而无需在字符串上调用 Integer.parseInt 方法或任何其他解析方法:

          (int)Math.pow(digits[j] - '0', j + 1);
      

      完整的代码如下所示:

      static List<Integer> sumDigPow(int a, int b) {
          List<Integer> eureka = new ArrayList<Integer>();
          int sum = 0;
          char[] digits;
      
          for (int i = a; i <= b; i++) {
              digits = String.valueOf(i).toCharArray();
              for (int j = 0; j < num.length(); j++) 
                  sum += (int)Math.pow(digits[j] - '0', j + 1);
      
              if (sum == i) eureka.add(i);
              sum = 0;
          }
          return eureka;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        相关资源
        最近更新 更多