使用 arraylists 得到错误的输出

Posted

技术标签:

【中文标题】使用 arraylists 得到错误的输出【英文标题】:Getting a wrong output using 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,但似乎无法在代码中找到问题所在。任何提示将不胜感激。

【问题讨论】:

【参考方案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;

解释:

    您没有检查号码的第二位。 循环遍历 String num 的每个字符。 不需要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;

【讨论】:

以上是关于使用 arraylists 得到错误的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ListView 的内容成为 ArrayList?

Arraylist.contains 不会检查字符串

Java程序员们最常犯的10个错误

总结软件开发过程中最常犯的10个问题

java throw new NoSuchElementException build failed with arraylist

把二叉树打印成多行