代码之家  ›  专栏  ›  技术社区  ›  user8076811

我的代码的错误结果

  •  0
  • user8076811  · 技术社区  · 7 年前

    我似乎有一个问题,我期望的结果是:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Pshemo    7 年前

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

    在位置处添加字符的行 i length - i 零。让我们看看会发生什么 s="9256" .

    如果 i=0

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

    正如你所看到的,你加了一个额外的零,因为你没有考虑到 9 表示千,但千虽然有4个数字,但应该有3个零。所以你需要用

    makesZero(s.length() - i - 1) .


    顺便提一下 builder.append(foo + bar) (何时 + 表示串联,而不是加法)应写为 builder.append(foo).append(bar) . 否则你会以这样的方式结束

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

    这意味着您仍然需要为每个 + .

    我们正在使用 StringBuilder#append 正是为了避免 + 以及这种不必要的对象创建。

        2
  •  0
  •   Adrian Lawson    7 年前

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

    下面是建议您重写的 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);
    }
    
        3
  •  -2
  •   Borjante    7 年前

    只需以i=1和i<=s、 长度()