我正在工作this Codebat problem。
我在前面的总数问题上看到了此处列出的解决方案。我已编码
if (str.length() == 0) {
return 0;
}
int sum = 0;
int start = 0;
int stop = 0;
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) {
start = i;
for (int j = i + 1; j < str.length(); j++) {
if (!Character.isDigit(str.charAt(j))) {
stop = j;
j = j + str.length();
}
}
sum += Integer.parseInt(str.substring(start, stop));
}
}
return sum;
我认为这是一种在字符串中查找数字开头和结尾的简单方法。当我在codingbat上运行时,我得到了"5hoco1a1e"
和"5$$1;;1!!"
的正确总和(7)。"Chocolate"
也返回0,这是正常的。在测试时我将return
更改为return start;
我得到一个5作为字符串"abc123xyz"
的结果(它应该是123)所有我正在做的(我认为)是设置当我找到字符串中的第一个数字时start
来自i
。关于我如何通过这段代码工作的任何想法?我真的不是在寻找答案,而是让某些人知道我误入歧途的地方。
答案 0 :(得分:1)
第一个缺陷是i
仅在内循环完成后移动到下一个字符。当i
需要移动到内循环停止的位置(i = j
或i = stop
)时。仅此一点并不能解决所有问题。
如果您的String
以数字结尾(即"5hoco1a1e123"
),则下一个缺陷是您的代码会抛出错误。一旦达到最后一个值,您的代码就会为start
分配一个新值,但stop
将无法获得新值。这会导致sum += Integer.parseInt(str.substring(start, stop));
错误,因为stop
小于start
答案 1 :(得分:0)
嵌套for循环完成后,i
仍然与循环开始前相同。要解决此问题,请在结束嵌套循环之前设置i = j
:
if (!Character.isDigit(str.charAt(j))){
stop = j;
i = j;
j = j+ str.length();
}