我似乎遇到了问题,我期望的输出是:
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));
}
}
答案 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。长度()