Palindrome vérification en Javascript
j'ai le texte suivant:
function checkPalindrom(palindrom)
{
for( var i = palindrom.length; i > 0; i-- )
{
if( palindrom[i] = palindrom.charAt(palindrom.length)-1 )
{
document.write('the word is palindrome.');
}else{
document.write('the word is not palindrome!');
}
}
}
checkPalindrom('wordthatwillbechecked');
Quel est le problème avec mon code? je veux vérifier si le mot est palindrome.
- Pourquoi pensez-vous qu'il ya quelque chose de mal avec votre code? Ce qui se passe et ce que vous attendez?
- De wikipedia: "les Allocations peuvent être faites pour des ajustements de lettres majuscules, de la ponctuation, de mot et de diviseurs".
Vous devez vous connecter pour publier un commentaire.
Je vais peut-être proposer d'autres solution:
UPD. Gardez cependant à l'esprit que c'est à peu près de la "tricherie" de la démarche, une démonstration de l'utilisation intelligente des fonctionnalités de la langue, mais pas la plus pratique de l'algorithme en temps O(n), l'espace O(n)). Pour la vraie vie de l'application ou de codage entretien, vous devriez certainement utiliser la solution de boucle. Le un posté par Jason Sebring dans ce fil de discussion est à la fois simple et efficace (en temps O(n), l'espace O(1)).
str = str.toLowerCase().replace( /[\s~`!@#$%^&*()-_+=[\]{}\\|:;"',<>.?\/\u2000-\u206F\u2E00-\u2E7F\u3000-\u303F]/g, '');
ou, si vous n'avez pas de soins sur support de l'Unicode,str = str.toLowerCase().replace(/\W/g, '')
function checkPalindrom(str) { var num = str; if (typeof num !== 'string'){ num = num.toString(); } return num === num.split('').reverse().join(''); }
25x plus rapide que la réponse standard
à utiliser comme:
comme il se définit "je" lui-même
Violon: http://jsfiddle.net/namcx0yf/9/
C'est environ 25 fois plus rapide que la norme de réponse ci-dessous.
Violon: http://jsfiddle.net/t0zfjfab/2/
Vue de la console pour les résultats de la performance.
Même si la solution est difficile à lire et à maintenir, je vous recommande de le comprendre pour démontrer la non-ramification avec la récursivité et le décalage de bits pour impressionner votre prochaine interviewer.
expliqué
Le || et && sont utilisés pour le contrôle de flux comme "si" "else". Si quelque chose à gauche de || est vrai, c'est juste des sorties avec vrai. Si quelque chose est faux à gauche de || il doit continuer. Si quelque chose de gauche && est faux, il sort comme faux, si quelque chose de gauche d'un && est vrai, il doit continuer. Ceci est considéré comme "non-ramification" comme il n'a pas besoin de si-sinon interupts, plutôt son juste évalués.
1. Utilisé un initialiseur ne nécessitant pas de "je" pour être défini comme un argument. Attribue le "je" pour elle-même si elle est définie, sinon initialiser à 0. Toujours est faux alors, la prochaine, OU la condition est toujours évalué.
2. Vérifie si "je" suis allé la moitié du chemin, mais ignore la vérification milieu bizarre char. Peu déplacé ici, c'est comme la division par 2, mais à la plus basse, même voisin de la division par 2 résultat. Si vrai, alors assume palindrome depuis sa déjà fait. Si la valeur est false évalue côté OU de l'état.
3. Compare depuis le début de char et de fin char selon le "je" par la suite, de rencontrer des voisins ou voisins du moyen-char. Si la valeur est false sorties et n'assume PAS palindrome. Si la valeur est true continue sur suivant ET de l'état.
4. Appelle de nouveau pour la récursivité en passant la chaîne d'origine comme "s". Car "je" est défini pour sûr, à ce stade, il est pré-incrémenté à poursuivre la vérification de la position de la chaîne. Retourne la valeur booléenne indiquant si palindrome.
MAIS...
Une simple boucle for est encore deux fois plus rapide que mon imagination réponse (alias principe de BAISER)
http://jsfiddle.net/6L953awz/1/
console.log(isPalindrome('Avid diva'));
isPalindrome('Avid diva'.toLowerCase())
retournetrue
.n / 2
à chaque fois, ce qui signifie que pour le même nombre de n, le niveau sera un petit nombre (en raison de journal 100000000000000 base 2 simplement juste 46)Premier problème
= est attribuer
== est de comparer
Deuxième problème, Votre logique ici est faux
Vous êtes en soustrayant l'un de l'charAt et non pas la longueur.
Troisième problème, il va encore être mal puisque vous n'êtes pas en réduisant la longueur de i.
Il fonctionne pour moi
La logique ici est tout à fait correct, vous devez vérifier chaque lettre afin de déterminer si le mot est un palindrome. Actuellement, vous imprimez plusieurs fois. Qu'en faisant quelque chose comme:
Qui devrait impression que c'EST un palindrome.
==
et===
.i < word.length / 2
, depuis tout itérations après à mi-chemin par le biais de la parole sont redondantes.if (checkPalindrome("Avid diva")) {
sera d'impression:The word is NOT a palindrome
Vous avez besoin de forcelowercase
pour couvrir les mots qui ont capitales...word = word.toLowerCase()
.. j'Espère que ça aide.Plus brefs CODE (31 caractères maximum)(ES6):
Garder à l'esprit court code n'est pas nécessairement la meilleure. La lisibilité et l'efficacité peut importe le plus.
.join('')
mais dramatiquement mal de lisibilité pour le plaisir de faire du code plus courtAu moins trois choses:
Vous essayez de test d'égalité avec
=
, qui est utilisé pour le réglage. Vous avez besoin de tester avec==
ou===
. (Probablement le dernier, si vous n'avez pas une raison pour le premier.)Vous êtes à la déclaration des résultats après vérification de chaque personnage. Mais vous ne savez pas les résultats jusqu'à ce que vous avez vérifié suffisamment de caractères.
Vous double-vérifier chaque caractère de la paire, que vous avez vraiment besoin de vérifier si, par exemple
first === last
et pas aussi silast === first
.Comme un beaucoup plus claire de la fonction récursive: http://jsfiddle.net/dmz2x117/
Pourquoi ai-je l'impression du résultat à l'extérieur de la boucle? Sinon, pour chaque match dans la parole, il va imprimer "est ou n'est pas pallindrome" plutôt que de vérifier le mot entier.
EDIT: mis à Jour avec les changements et un correctif proposé par Basemm.
La chose la plus importante à faire lors de la résolution d'un Test Technique est N'utilisez pas de méthodes de raccourci -- ils veulent voir comment vous penser avec des algorithmes! Pas votre utilisation de méthodes.
Voici celle que j'ai trouvé (45 minutes après j'ai fait sauter le test). Il y a quelques optimisations à faire si. Lors de l'écriture de l'algorithme, de son mieux pour assumer
false
et de modifier la logique si son qui cherchent à êtretrue
.isPalindrome()
:En gros, pour faire de cette course dans O(N) (linéaire) de la complexité que vous voulez avoir 2 itérateurs dont les vecteurs point les uns envers les autres. Sens, un itérateur qui commence au début et celle qui commence à la fin, chaque voyage vers l'intérieur. Vous pourriez avoir les itérateurs parcourir l'ensemble du tableau et utiliser une condition pour
break
/return
une fois qu'ils se rencontrent au milieu, mais il peut gagner un peu de travail pour donner à chaque itérateur un demi-longueur par défaut.for
boucles semblent forcer l'utilisation de plus de vérifications, j'ai donc utiliséwhile
boucles - je suis moins à l'aise avec.Voici le code:
Avis que si les boucles de comptage, il retourne
true
. La logique devrait être inversé de sorte qu'il renvoie par défautfalse
. J'ai aussi utilisé une méthode abrégéeString.prototype.charAt(n)
, mais je me sentais OK avec ce que chaque langue prend nativement en charge cette méthode.Trouve et supérieure à la baisse des cas. Scinde une chaîne en un tableau, je ne sais pas pourquoi quelques espaces blancs restent, mais je voulais l'attraper et les lettres individuelles.
=
danspalindrom[i] = palindrom.charAt(palindrom.length)-1
devrait être==
ou===
palindrom.charAt(palindrom.length)-1
devrait êtrepalindrom.charAt(palindrom.length - i)
J'ai ajouté un peu plus pour les fonctions ci-dessus, à vérifier, comme les chaînes, "Aller accrocher un saucisson, je suis une lasagne de porc".
Grâce
Partage mon jeûne variante qui a également en charge les espaces
JS:
HTML:
Je me demandais pourquoi personne n'a suggéré ceci:
ES6:
ES5:
Méthode Récursive:
Je pensais que je voudrais partager ma propre solution:
JS:
L'espère pourra aider quelqu'un.
Les uns au dessus de courte anwsers est bon, mais il n'est pas facile à comprendre, je suggère une façon de plus:
Je compare chaque personnage,
i
commencer par la gauche,j
commencer à partir de la droite, jusqu'à ce que leur indice n'est pas valide (i<j
).Il travaille également dans toutes les langues
J'ai trouvé ceci sur un site d'entrevue:
De jouer un peu avec elle, je suis venu avec ce vilain morceau de code 🙂
Simplement laisser ici pour la postérité.
Comment à ce sujet, à l'aide d'un simple drapeau
flag
est jamais mis àfalse
– ie, il suffit de retournerfalse
immédiatement chaque fois que les personnages ne correspondent pas(JavaScript) à l'Aide de regexp, cette vérification pour alphanumériques palindrome et ne tient pas compte de l'espace et de la ponctuation.
Boucle à travers la chaîne de caractères à la fois vers l'avant (i) et en arrière (j) à l'aide d'une boucle for. Si à tout moment le caractère à
str[i]
ne pas l'égalité desstr[j]
- alors il n'est pas un palindrome. Si nous avons réussi à faire une boucle par la chaîne, alors c'est un palindrome.Cela évite les regex, mais aussi de gérer des chaînes qui ont les espaces et les majuscules...
Pensé, je vais partager ma solution à l'aide du Tableau.le prototype.filter(). filtre()
les filtres de la matrice basée sur des valeurs booléennes, la fonction renvoie.
Cela a fonctionné pour moi.
Voici une solution qui fonctionne même si la chaîne contient des caractères non alphanumériques.
L'écriture de code pour la vérification des palindromes en suivant les meilleures pratiques de JavaScript:
JS:
En utilisant la récursivité:
La solution avec ES6
Vous pouvez essayer ce qui suit
J'ai utilisé un ternaire dans ce cas de garder une trace de l'indice à l'envers:
De la première utilisation de la getElement tag de la variable du palindrome. En le voyant comme un palindrome peut être composé de plusieurs mots que vous utilisez la regex entrée pour supprimer les espaces. Ensuite, vous utilisez la fonction de répartition pour convertir la chaîne en un tableau.
Ensuite, vous utilisez la méthode inverse à l'inverse de la matrice lorsque cela est fait, vous rejoignez l'inversion de la matrice de retour dans une chaîne. Enfin, il vous suffit d'utiliser un très de base si l'instruction pour vérifier l'égalité, si l'inversion de la valeur est equall à l'initiale de la variable que vous avez vous-même un palindrome.
Cette version permet de caractères spéciaux comme le "ñ" ou "àèìòù" que dans les autres réponses ne permet pas de résoudre cela:
Nice réponses ici.
Voici une autre approche.