Anirudh Anirudh - 25 days ago 10
Java Question

Alternate CodingBat sumNumbers exercise solution

I was trying to get around the below problem in codingBat for Java:
http://codingbat.com/prob/p121193

Given a string, return the sum of the numbers appearing in the string, ignoring all other characters. A number is a series of 1 or more digit chars in a row. (Note: Character.isDigit(char) tests if a char is one of the chars '0', '1', .. '9'. Integer.parseInt(string) converts a string to an int.)
sumNumbers("abc123xyz") → 123
sumNumbers("aa11b33") → 44
sumNumbers("7 11") → 18


Below is my solution

public int sumNumbers(String str) {
final int len=str.length();

int[] numbers=new int[len];
int count=0;
String temp="";
int sum=0;

for(int i=0;i<len;i++)
{
if(Character.isDigit(str.charAt(i)))
{
temp=temp+str.substring(i, i+1);

if(i==len-1)
{
numbers[count]=Integer.parseInt(temp);
break;
}
if(Character.isDigit(str.charAt(i+1)))
{
continue;
}
else
{
numbers[count]=Integer.parseInt(temp);
count++;
temp="";
}
}

}
for(int j=0;j<numbers.length;j++)
{
sum=sum+numbers[j];
}
return sum;

}


It's a simple problem please provide any alternative efficient answers using regex or anyway other PLEASE DO NOT USE ANYTHING FROM COLLECTIONS FRAMEWORK.

Answer

Here's my solution. It's similar to yours.

public int sumNumbers(String str) {
    int sPos = -1;
    int ePos = -1;
    int sum = 0;

    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (Character.isDigit(c)) {
            if (sPos < 0) {
                sPos = i;
                ePos = i;
            } else {
                ePos = i;
            }
        } else {
            sum = add(str, sum, sPos, ePos);
            sPos = -1;
        }
    }

    sum = add(str, sum, sPos, ePos);

    return sum;
}

private int add(String str, int sum, int sPos, int ePos) {
    if (sPos >= 0) {
        sum += Integer.parseInt(str.substring(sPos, ePos + 1));
    }
    return sum;
}