我的代码结果不好

时间:2018-04-08 09:01:20

标签: java debugging

我似乎遇到了问题,我期望的输出是:

9000 + 200 + 50 + 6

但我明白了:

90000 + 2000 + 500 + 60

这是我的代码:

class Kata
{
    public static String expandedForm(int num) {
        String s =  String.valueOf(num);
        StringBuilder result = new StringBuilder();

        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '0') continue;
            result.append(s.charAt(i) + makesZero(s.length() - i));
            if(i != s.length() - 1) result.append(" + ");
        }
        return result.toString();
    }

    public static String makesZero(int num) {
        StringBuilder result = new StringBuilder();
        for(int i = 0; i < num; i++)
            result.append("0");
        return result.toString();
    }
}

public class Main {
    public static void main(String args[]) {
        System.out.println(Kata.expandedForm(9256));
    }
}

3 个答案:

答案 0 :(得分:3)

result.append(s.charAt(i) + makesZero(s.length() - i));

一行,您将在i位置添加字符,并在length - i零。让我们看看s="9256"会发生什么。

如果i=0

  • s.charAt(i) - &gt; s.charAt(0) - &gt; '9'(看起来不错)
  • makesZero(s.length() - i) - &gt; makesZero(4 - 0)) - &gt; makesZero(4) - &gt; "0000"

所以当你看到你正在添加一个额外的零因为你没有考虑到虽然9代表数千,但数千,尽管有4位数应该有3个零。所以你需要用

减少一个零

<强> makesZero(s.length() - i - 1)

BTW builder.append(foo + bar)(当+表示连接而非添加时)应写为builder.append(foo).append(bar)。否则你将以

之类的结尾

builder.append(new StringBuilder().append(foo).append(bar).toString())

这意味着您仍需要为每个+创建单独的构建器。

我们正在使用StringBuilder#append,因此我们可以避免+这样不必要的对象创建。

答案 1 :(得分:0)

你正在处理一个经典的逐个错误。这很容易解决,但是您的方法遇到的更大问题是您以不自然的方式解决问题,这使您的代码更难以理解和调试。确定要添加多少个零基本上是一个数学问题,但是你将它视为字符串问题,这会降低代码的表现力。

以下是对expandedForm方法的建议重写,以不同的方式解决此问题。

public static String expandedForm(int num) {
    if (num == 0)
        return "0";

    int zeroes = (int) Math.log10(num);
    StringBuilder result = new StringBuilder();

    while (zeroes >= 0) {
        int multiple = (int) Math.pow(10, zeroes);
        int digit = num / multiple;
        result.append(String.valueOf(digit * multiple));

        if (zeroes > 0)
            result.append(" + ");

        num = num % multiple;
        --zeroes;
    }

    return new String(result);
}

答案 2 :(得分:-2)

刚开始你的循环,i = 1,i&lt; = s。长度()