Je suis dans une impasse tout en essayant de réparer certaines lignes Dans mon code.
La tâche écrit une fonction de récursivité qui prend une chaîne et un calcul La somme des nombres dedans. p>
par exemple - p> La capture dans cette tâche est de la somme des nombres à plusieurs chiffres.
(11 dans notre cas) p> Je n'ai pas prévu d'utiliser des tableaux de caractère ni quoi que ce soit, mais que travailler avec des chaînes dans certaines lignes rendit difficile la tâche. P> Mon code ne compile pas jusqu'à présent Mais je suis sûr que la logique est dans le bon endroit - (j'ai fait une fonction d'assistance, ce qui signifie que ce n'est pas la fonction finale, mais sa tâche principale). P> public static int sumNumbersInText(String str, int i, String subStr, int sum) {
if(str.length() >= i) return sum;
char[] array = new char[str.length()];
str.getChars(0, str.length(), array, 0);
char oneStr = array[i];
String newSubStr = subStr;
if(Character.isDigit(oneStr)); //if the new index is not a number and the index before IS a number>
{
if(Character.isDigit(subStr));// new index IS a number, therefore will sum up.
{
int num = 0;
sum+=num;
newSubStr = "";
}
}
else
{
newSubStr += oneStr;
}
return sumNumbersInText(str, i+1, subStr, sum);
}
3 Réponses :
C'est comme ça que je l'aborderais:
public class AddMultipleDigitsInStringRecursive
{
public static void main(String[] args)
{
String input = "5a-f5-11";
System.out.println("Input: " + input);
int sum = sumDigits(input);
System.out.println("Sum: " + sum);
}
public static int sumDigits(String input)
{
return addDigits(input, 0, "");
}
private static int addDigits(String input, int index, String curNumber)
{
if(index < input.length())
{
int curSum = 0;
String curChar = input.substring(index, index + 1); // get the current character (as a String)
if (Character.isDigit(curChar.charAt(0))) // if it's a digit, append it to the current number
{
curNumber = curNumber + curChar;
}
else // it's not a digit, do we have a number pending?
{
if (!curNumber.isEmpty())
{
curSum = Integer.parseInt(curNumber); // convert current number to an Integer
}
curNumber = ""; // reset the current number so we can accumulate more digits when they are found
}
// return the sum of the current number (if any) with any other numbers that are found
return curSum + addDigits(input, index + 1, curNumber);
}
else // reached the end of the string; was there a number pending?
{
int curSum = 0;
if (!curNumber.isEmpty())
{
curSum = Integer.parseInt(curNumber);
}
return curSum;
}
}
}
de quelque manière réussite à la comprendre, cela fonctionne réellement:
public static int sum(String str, int i, String subStr, int sum) {
if(str.length() <= i) return sum;
String newSubStr = subStr;
char oneStr = str.charAt(i);
if(!Character.isDigit(oneStr)) //if the new index is not a number and the index before IS a number>
{
if(isNumeric(subStr))// new index IS a number, therefore will sum up.
{
int num = Integer.parseInt(subStr);
sum+=num;
newSubStr = "";
}
}
else
{
String temp = oneStr+"";
newSubStr += temp;
}
System.out.println(sum);
return sum(str, i+1, newSubStr, sum);
}
Vous n'avez pas besoin du si (isnumeric (substr)) code> vérifier. Le seul moment où vous avez annexé à cette chaîne était dans le bloc d'enrête de ! Caractère.isdigit (ONESSEtr) code>, vous n'ajoutez donc que des chiffres valides et que la chaîne doit déjà être un nombre valide. Vous pouvez simplement vérifier si "substrateur" est pas vide b>, puis ajoutez ce numéro.
En utilisant votre exemple d'entrée de "5A-F5-11", votre code est correctement renvoyé 10. Votre première ligne de la fonction récursive vérifie pour voir si vous avez passé la fin de la chaîne. À ce stade, vous devez voir s'il existe une valeur dans "substraire" en attente d'être ajoutée à la somme actuelle.
Vous devez faire le nom de la fonction et le quatrième paramètre différent; Ils sont tous deux "somme" qui peuvent être déroutants. En fait, vous n'avez même pas besoin de ce quatrième paramètre ... il est possible de le faire avec seulement les trois premiers (voir ma solution).
Eh bien, voici un moyen simple d'utiliser la récursivité pour résoudre le problème. J'ai utilisé une expression régulière pour saisir les chiffres puisque vous n'avez pas indiqué qu'il n'était pas autorisé.
public static int sum(String a) {
Matcher m = Pattern.compile("(\\d\\d+)").matcher(a);
if (m.find()) {
return Integer.parseInt(m.group(1)) + sum(a.substring(m.end()));
}
return 0;
}
Retirez le point-virgule après vos tests IF (comme celui dans
si (caractère.isdigit (OnetrStr)); code>). Ils terminent immédiatement votre bloc IF, causant ce que vous pensez être le bloc IF pour toujours exécuter.La réursion est-elle une exigence ou est-ce que votre idée?
"La capture dans cette tâche est de la somme des nombres à plusieurs chiffres. (11 Dans notre cas)" Il n'est pas clair ce qui devrait être fait ici. Si vous trouvez plusieurs chiffres et traitez-les comme un nombre entier B> (11), ou additionnez les chiffres pour obtenir 2? Et s'il y a plus d'un chiffres à plusieurs chiffres comme dans "5A-F5-11-B2-41"? Quel résulterait-il maintenant?
@Murinik c'est une exigence, lol avec la boucle, ce n'est pas aussi difficile.
@Idle_mind c'est tout à fait clair si vous ne manquez pas cette sortie - SORTIE «5A-F5-11» - Les chiffres sont 5, 5 et 11, la somme est donc de 21.
Toujours pas clair ... La description et l'exemple ne correspondent pas. Le libellé indique "les numéros de somme plus b> que un b> chiffre". Alors pourquoi les Fives sont-ils inclus? En outre, les multiples chiffres ne sont pas "résumés", ils sont concatérés et traités comme un nombre entier.
Je pourrais interpréter cela comme "somme" les chiffres de "11" (parce qu'ils ont plus d'un chiffre) et obtiennent le résultat de 2.
@Idle_mind Eh bien, ils veulent simplement dire, s'il y a un numéro séparé par l'espace, ou tout autre caractère de l'autre numéro, traitez-le comme un numéro à un chiffre. Mais si le nombre est suivi d'un autre nombre, tel que 11 dans cet exemple, traitez-le comme tout entier (11) non 1 + 1. C'est pourquoi l'entrée de "5A-F5-11" va retourner 21. i pourrait essayer de le simplifier plus si vous avez besoin.