对于此问题:http://codingbat.com/prob/p121193
我写了这段代码:
public int sumNumbers(String str) {
int y = 0;
int z = 0;
for (int f4 = 0; f4 < str.length(); f4++) {
if (Character.isDigit(str.charAt(f4))) {
for (int f5 = f4; f5 < str.length(); f5++) {
if (!Character.isDigit(str.charAt(f5))) {
z = (Integer.parseInt(str.substring(f4, f5)));
y = y + z;
f4 = f5 - 1;
break;
}
}
}
}
return y;
}
这些是问题(它们不是代码,但拒绝接受我的问题):
sumNumbers("abc123xyz") Expected: 123; Returned: 123
sumNumbers("aa11b33") Expected: 44; Returned: 11
sumNumbers("7 11") Expected: 18; Returned: 7
sumNumbers("Chocolate") Expected: 0; Returned: 0
sumNumbers("5hoco1a1e") Expected: 7; Returned: 7
sumNumbers("5$$1;;1!!") Expected: 7; Returned: 7
sumNumbers("a1234bb11") Expected: 1245; Returned: 1234
sumNumbers("") Expected: 0; Returned: 0
sumNumbers("a22bbb3") Expected: 25; Returned: 22
总而言之,由于某些原因,我的代码无法处理超过一位数的多个数字,我不知道为什么。我一直在打开和关闭这个问题,虽然我拒绝直接查找答案,但我真的可以使用一些帮助。 我在高中AP Comp。科学。
答案 0 :(得分:1)
您的代码没有任何问题。唯一的问题是您没有正确处理边界条件。您正在检查是否aa11b33
。现在,如果你的内心疲惫而且没有遇到这种情况怎么办?
例如,如果测试用例失败,则最后一个或最后几个字符是整数。
请参阅此33
。现在,y
将永远不会添加到您的总和中,即if
,因为您的public int sumNumbers(String str) {
int y = 0, z = 0, f4, f5 = 0;
for (f4 = 0; f4 < str.length(); f4++) {
if (Character.isDigit(str.charAt(f4))) {
for (f5 = f4; f5 < str.length(); f5++) {
if (!Character.isDigit(str.charAt(f5))) {
z = (Integer.parseInt(str.substring(f4, f5)));
y = y + z;
f4 = f5;
break;
}
}
/* Handle Boundary Conditions */
if (f4 != f5) {
z = (Integer.parseInt(str.substring(f4, str.length())));
y = y + z;
break;
}
}
}
return y;
}
条件永远不会被执行而内部会被耗尽。
您需要处理边界条件以识别这些有效输入,然后将它们添加到总和中。
以下是供参考的更正代码段:
{{1}}
答案 1 :(得分:1)
以下是您修改的代码,用于处理在String末尾找到有效数字的情况。我认为你可以重构一下,将重复的逻辑提取到一个方法中,并且只计算一次str.length()。但在这里它会返回您期望的结果:
public int sumNumbers(String str) {
int y = 0;
int z = 0;
for (int f4 = 0; f4 < str.length(); f4++) {
Character c = str.charAt(f4);
if (Character.isDigit(c)) {
for (int f5 = f4; f5 < str.length(); f5++) {
Character c2 = str.charAt(f5);
if (!Character.isDigit(c2)) {
z = (Integer.parseInt(str.substring(f4, f5)));
y+= z;
f4 = f5 - 1;
break;
}
else if(Character.isDigit(c2) && f5 == str.length() -1){
z = Integer.parseInt(str.substring(f4 ,str.length()));
y += z;
f4 = f5;
break;
}
}
}
}
return y;
}
答案 2 :(得分:0)
分析输出,我们清楚地看到输入字符串最末端的数字被忽略。在末尾具有非数字的所有字符串都被正确解析 - 例如“5 $$ 1 ;; 1 !!”总计最多7个。
查看内部for循环,它查找已经识别的数字的长度,我们可以看到循环在内部条件语句有机会总结之前结束。
解决方案是简单地将求和特征移出内循环:
public static int sumNumbers(String str) {
int sum = 0;
for (int start = 0; start < str.length(); start++) {
if (Character.isDigit(str.charAt(start))) {
int end;
for (end = start; end < str.length(); end++) {
if (!Character.isDigit(str.charAt(end))) {
break;
}
}
sum += (Integer.parseInt(str.substring(start, end)));
start = end - 1;
}
}
return sum;
}
请注意,我稍微重命名了一些变量,以使它们更具可读性。
总结的另一种方法是使用regular expression。我提到这一点是因为for循环看起来非常复杂,而且这个任务的正则表达式非常易读。
// \d+ means numbers with a minimum of 1 character
// (...) makes it a group that can be referred to later
private static Pattern NUMBERS = Pattern.compile("(\\d+)");
public static int sumNumbers(String str) {
Matcher matcher = NUMBERS.matcher(str);
int sum = 0;
while (matcher.find()) {
sum += Integer.parseInt(matcher.group());
}
return sum;
}
答案 3 :(得分:0)
您的解决方案根本不处理字符串末尾的数字。我会建议这样的解决方案:
int y = 0;
int z = 0;
for (int f4 = 0; f4 < str.length(); f4++) {
int f5 = 0;
// forward while digits found
for (f5 = f4; f5 < str.length() && Character.isDigit(str.charAt(f5)); f5++);
// if found at least one digit parse it
if(f5 > f4){
z = (Integer.parseInt(str.substring(f4, f5)));
y = y + z;
f4 = f5 - 1;
}
}
return y;
答案 4 :(得分:0)
public int sumNumbers(String str) {
int y = 0;
int z = 0;
for (int f4 = 0; f4 < str.length(); f4++) {
if (Character.isDigit(str.charAt(f4))) {
for (int f5 = f4; f5 < str.length(); f5++) {
if (!Character.isDigit(str.charAt(f5))) {
z = (Integer.parseInt(str.substring(f4, f5)));
y = y + z;
z = 0;
f4 = f5;
break;
}
if (!Character.isDigit(str.charAt(f5)) || f5 == (str.length() - 1)) {
z = (Integer.parseInt(str.substring(f4, f5 + 1)));
y = y + z;
z = 0;
f4 = f5;
break;
}
}
}
}
return y;
}
答案 5 :(得分:0)
问题也可以用另一种方式解决。
public int sumNumbers(String str) {
int result=0;
int firstPosOfDig=0;
int LastPosOfDig=0;
for(int i=0; i<str.length();i++)
{
if(Character.isDigit(str.charAt(i)))
{
if(i==0 || !Character.isDigit(str.charAt(i-1)))
firstPosOfDig=i;
if(i==str.length()-1 || !Character.isDigit(str.charAt(i+1)))
{
LastPosOfDig=i;
result+=Integer.parseInt(str.substring( firstPosOfDig, LastPosOfDig+1));
}
}
}
return result;
}