J'ai un problème simple,
Étant donné une chaîne S de parenthèses '(' et ')', nous ajoutons le nombre minimum de parenthèses ('(' ou ')', et dans toutes les positions) pour que la chaîne de parenthèses résultante est valide.
Formellement, une chaîne de parenthèses est valide si et seulement si: C'est la chaîne vide, ou Il peut être écrit comme AB (A concaténé avec B), où A et B sont des chaînes valides, ou Il peut être écrit comme (A), où A est une chaîne valide. Étant donné une chaîne de parenthèses, renvoie le nombre minimum de parenthèses que nous devons ajouter pour rendre la chaîne résultante valide.
Voici ma solution dans JS,
TypeError: S.map is not a function at minAddToMakeValid (/Users/melissa/Dropbox/js/leetcode-js/bin/921_minAddToMakeParanthesisValid.js:4:7) at Object.<anonymous> (/Users/melissa/Dropbox/js/leetcode-js/bin/921_minAddToMakeParanthesisValid.js:19:13) at Module._compile (internal/modules/cjs/loader.js:721:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:732:10) at Module.load (internal/modules/cjs/loader.js:620:32) at tryModuleLoad (internal/modules/cjs/loader.js:560:12) at Function.Module._load (internal/modules/cjs/loader.js:552:3) at Function.Module.runMain (internal/modules/cjs/loader.js:774:12) at executeUserCode (internal/bootstrap/node.js:342:17) at startExecution (internal/bootstrap/node.js:276:5)
J'obtiens l'erreur suivante,
const minAddToMakeValid = S => { const stack = []; let count = 0; S.map(c => { if(c === '('){ stack.push(c); } else if(c === ')' && stack[stack.length -1] === '('){ stack.pop(); } else{ count ++; } }); return count + stack.length; }; const S = "())"; console.log(minAddToMakeValid(S));
3 Réponses :
Une String
n'est pas un Array
: elle n'a pas les mêmes méthodes.
Cependant, vous pouvez utiliser S.split ("")
pour obtenir un tableau, puis map
dessus
Donc une chaîne non itérable en javascript?
Ce n'est pas ce que j'ai dit: j'ai dit que ce n'était pas un Array
et qu'il n'avait donc pas accès à ses méthodes (telles que map
, filter code>, etc ...)
Documentation: Array | Chaîne .
Les chaînes sont itérables stackoverflow.com/questions/1966476/… . Ils n’ont tout simplement pas de méthode cartographique.
S est une chaîne, pas un tableau. C'est pourquoi vous ne pourrez pas le cartographier.
[... S] .map () devrait fonctionner.
Le ...
est un opérateur de diffusion . Il faudra quelque chose d'itérable (comme une chaîne ou un tableau) qui l'étalera en arguments. En le plaçant entre crochets de tableau, il créera un nouveau tableau rempli de tout ce que vous y avez «répandu».
const S = 'demo string'; [...S].map((char)=>{ console.log(char); })
const s = 'test'; const arr = [...s]; // = ['t', 'e', 's', 't']
public int minAddToMakeValid (String S) {
int output = 0; int open = 0; char[] sArr = S.toCharArray(); for(char i=0; i < sArr.length; i++){ if(sArr[i] == '('){ output++; open++; if((i+1 < sArr.length) && sArr[i+1] == ')'){ output--; open--; } else if((i+1 < sArr.length) && sArr[i+1] == '('){ output++; open++; } i = (char)(((i-'0')+1) + '0'); } else if(sArr[i] == ')'){ if(open < 1){ output++; }else{ output--; open--; } if((i+1 < sArr.length) && sArr[i+1] == ')' && open < 1){ output++; i = (char)(((i-'0')+1) + '0'); } else if((i+1 < sArr.length) && sArr[i+1] == ')' && open > 0){ output--; open--; i = (char)(((i-'0')+1) + '0'); } else if((i+1 < sArr.length) && sArr[i+1] == '('){ output++; open++; i = (char)(((i-'0')+1) + '0'); } } } return Math.abs(output);
}
Le nom de la méthode ne ressemble pas à javascript et assurez-vous que la fonction est à l'intérieur du code de bloc.