Contrôle de Palindrome en Javascript

j'ai le 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');

Qu'est-ce qui ne va pas avec mon code? je veux vérifier si le mot est palindrome.

34
demandé sur aksu 2013-02-11 17:50:47

30 réponses

peut-être que je suggérerai probablement une meilleure solution:

function checkPalindrom(str) {
    return str == str.split('').reverse().join('');
}
135
répondu dfsq 2013-02-11 14:01:26

25x plus rapide que la réponse standard

function isPalindrome(s,i) {
 return (i=i||0)<0||i>=s.length>>1||s[i]==s[s.length-1-i]&&isPalindrome(s,++i);
}

utiliser comme:

isPalindrome('racecar');

comme il définit "i" lui-même

violon: http://jsfiddle.net/namcx0yf/9/

c'est environ 25 fois plus rapide que la réponse standard ci-dessous.

function checkPalindrome(str) {
  return str == str.split('').reverse().join('');
}

violon: http://jsfiddle.net/t0zfjfab/2/

Voir la console pour les résultats de performance.

bien que la solution soit difficile à lire et à maintenir, je recommande de la comprendre pour démontrer la non-ramification avec la récursion et le décalage de bits pour impressionner votre prochain interviewer.

expliquée

Le || et && sont utilisés pour le contrôle de flux comme "si" "else". Si ce qui reste de || est vrai, il sort avec true. Si quelque chose est à gauche de || il doit continuer. Si ce qui reste de & & est faux, il sort comme faux, si ce qui reste de && est vrai, il doit continuer. Ceci est considéré comme "non-ramification" car il n'a pas besoin SI-AUTREMENT interupts, plutôt son juste évalué.

1. utilise un initialiseur n'exigeant pas que" i " soit défini comme un argument. Assigne " i " à lui-même si défini, sinon initialise à 0. Est toujours faux donc suivant ou condition est toujours évalué.

(i = i || 0) < 0

2. vérifie si" i " est allé à mi-chemin, mais passe à côté de la vérification de l'omble du milieu. Bit décalé ici est comme la division par 2, mais à la plus basse même la division de voisinage par 2 résultat. Si vrai alors suppose palindrome depuis son déjà fait. Si false évalue ensuite ou condition.

i >= s.length >> 1

3. compare l'omble au début et l'omble à la fin selon" i " pour finalement se rencontrer en tant que voisins ou voisins à l'omble du milieu. Si false sort et suppose Pas palindrome. Si vrai continue à la prochaine et condition.

s[i] == s[s.length-1-i]

4. S'appelle de nouveau pour la récursion passant la chaîne originale comme"s". Puisque "i" est défini pour sûr à ce point, il est pré-incrémenté pour continuer à vérifier la position de la corde. Retourne la valeur booléenne indiquant si palindrome.

isPalindrome(s,++i)

mais...

un simple pour boucle est encore environ deux fois plus rapide que mon fantaisie réponse ( aka principe de BAISER )

function fastestIsPalindrome(str) {
  var len = Math.floor(str.length / 2);
  for (var i = 0; i < len; i++)
    if (str[i] !== str[str.length - i - 1])
      return false;
  return true;
}

http://jsfiddle.net/6L953awz/1/

28
répondu Jason Sebring 2016-11-21 17:57:43

premier problème

= est attribuer = = comparaison

Deuxième problème, Votre logique ici est faux

palindrom.charAt(palindrom.length)-1

vous soustrayez un du charAt et non la longueur.

troisième problème, il sera encore faux puisque vous ne réduisez pas la longueur par I.

9
répondu epascarello 2013-02-11 13:53:26

Ça marche pour moi

function palindrome(str) {
  /* remove special characters, spaces and make lowercase*/
  var removeChar = str.replace(/[^A-Z0-9]/ig, "").toLowerCase();

  /* reverse removeChar for comparison*/
  var checkPalindrome = removeChar.split('').reverse().join('');

  /* Check to see if str is a Palindrome*/
   return (removeChar === checkPalindrome);
}
9
répondu Adolfo Luzardo Cabrera 2015-12-04 11:19:15

la logique ici n'est pas tout à fait correcte, vous devez vérifier chaque lettre pour déterminer si le mot est un palindrome. Actuellement, vous imprimez plusieurs fois. Que diriez-vous de faire quelque chose comme:

function checkPalindrome(word) {    
    var l = word.length;
    for (var i = 0; i < l / 2; i++) {
        if (word.charAt(i) !== word.charAt(l - 1 - i)) {
            return false;
        }
    }
    return true;
}

if (checkPalindrome("1122332211")) {
    document.write("The word is a palindrome");
} else {
    document.write("The word is NOT a palindrome");
}

qui devrait imprimer qu'il est en effet un palindrome.

8
répondu BeRecursive 2013-02-11 14:43:27

au moins trois choses:

  • Vous êtes en train de tester, pour l'égalité avec les = , qui est utilisé pour le réglage. Vous devez tester avec == ou === . (Probablement le dernier, si vous n'avez pas une raison pour le premier.)

  • vous déclarez les résultats après avoir vérifié chaque caractère. Mais vous ne connaissez pas les résultats tant que vous n'avez pas vérifié assez de caractères.

  • vous double-vérifiez chaque paire de caractères, comme vous n'avez vraiment besoin de vérifier si, dire first === last et pas aussi si last === first .

6
répondu Scott Sauyet 2013-02-11 13:56:34

comme une fonction récursive beaucoup plus claire: http://jsfiddle.net/dmz2x117 /

function isPalindrome(letters) {

    var characters  = letters.split(''),
        firstLetter = characters.shift(),
        lastLetter  = characters.pop();

    if (firstLetter !== lastLetter) {
        return false;
    }

    if (characters.length < 2) {
        return true;
    }

    return isPalindrome(characters.join(''));

}
5
répondu Wildhoney 2015-05-12 11:01:42

code le plus court (31 caractères) (ES6):

p=s=>s==[...s].reverse().join``
p('racecar'); //true
5
répondu Max 2016-03-04 15:18:55

la chose La plus importante à faire lors de la résolution d'un Test Technique est N'utilisez pas les méthodes de raccourci -- ils veulent voir comment vous penser avec des algorithmes! Pas votre utilisation de méthodes.

En voici un que j'ai trouvé (45 minutes après que j'ai raté le test). Il y a quelques optimisations à faire. En écrivant n'importe quel algorithme, son meilleur pour supposer false et modifier la logique si son regard pour être true .

isPalindrome() :

fondamentalement, pour faire cette course dans O(N) complexité (linéaire) vous voulez avoir 2 itérateurs dont les vecteurs pointent l'un vers l'autre. Sens, un itérateur qui commence au début et celle qui commence à la fin, chaque voyage vers l'intérieur. Vous pouvez faire traverser tout le tableau aux itérateurs et utiliser une condition pour break / return une fois qu'ils se rencontrent au milieu, mais il peut sauver du travail pour donner seulement à chaque itérateur demi-longueur par défaut.

for boucles semblent forcer l'utilisation de plus de contrôles, donc j'ai utilisé while boucles - qui je suis moins à l'aise avec.

voici le code:

/**
 * TODO: If func counts out, let it return 0
 *  * Assume !isPalindrome (invert logic)
 */
function isPalindrome(S){
    var s = S
      , len = s.length
      , mid = len/2;
      , i = 0, j = len-1;

    while(i<mid){
        var l = s.charAt(i);
        while(j>=mid){
            var r = s.charAt(j);
            if(l === r){
                console.log('@while *', i, l, '...', j, r);
                --j;
                break;
            }
            console.log('@while !', i, l, '...', j, r);
            return 0;
        }
        ++i;
    }
    return 1;
}

var nooe = solution('neveroddoreven');  // even char length
var kayak = solution('kayak');  // odd char length
var kayaks = solution('kayaks');

console.log('@isPalindrome', nooe, kayak, kayaks);

notez que si les boucles sont comptées, il retourne true . Toute la logique devrait être inversée de sorte qu'il par défaut renvoie false . J'ai également utilisé une méthode de raccourci String.prototype.charAt(n) , mais je me suis senti OK avec cela que chaque langue soutient nativement cette méthode.

4
répondu Cody 2014-03-23 20:35:36
function palindromCheck(str) {
    var palinArr, i,
        palindrom = [],

    palinArr = str.split(/[\s!.?,;:'"-()]/ig);

    for (i = 0; i < palinArr.length; i++) {
        if (palinArr[i].toLowerCase() === palinArr[i].split('').reverse().join('').toLowerCase() &&
            palinArr[i] !== '') {
            palindrom.push(palinArr[i]);
        }
    }
        return palindrom.join(', ');
}
console.log(palindromCheck('There is a man, his name! was Bob.')); //a, Bob

trouve et Majuscule à minuscule. Je ne sais pas pourquoi il reste quelques espaces blancs, mais je voulais attraper et des lettres simples.

4
répondu Ilian Grekov 2014-10-11 16:11:40
  • = dans palindrom[i] = palindrom.charAt(palindrom.length)-1 doit être == ou ===
  • palindrom.charAt(palindrom.length)-1 devrait être palindrom.charAt(palindrom.length - i)
3
répondu fardjad 2013-02-11 13:53:19
function checkPalindrom(palindrom)
{
   var flag = true;
   var j = 0;
    for( var i = palindrom.length-1; i > palindrom.length / 2; i-- )
    {
        if( palindrom[i] != palindrom[j] )
        {
           flag = false;
           break; // why this? It'll exit the loop at once when there is a mismatch.
        }
        j++;
    }
  if( flag ) {
  document.write('the word is palindrome.');
  }
  else {
document.write('the word is not palindrome.');
  }
}
checkPalindrom('wordthatwillbechecked');

Pourquoi est-ce que j'imprime le résultat en dehors de la boucle? Sinon, pour chaque correspondance dans le mot, 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.

3
répondu KBN 2014-01-09 12:24:25

j'ai ajouté un peu plus aux fonctions ci-dessus, pour vérifier les cordes comme,"allez accrocher un salami, je suis un porc lasagnes".

function checkPalindrom(str) {
    var str = str.replace(/[^a-zA-Z0-9]+/gi, '').toLowerCase();
    return str == str.split('').reverse().join('');
}

Merci

3
répondu Robin C Samuel 2014-01-15 10:53:11

partager ma variante rapide qui supporte aussi les espaces

function isPalindrom(str) {
  var ia = 0;
  var ib = str.length - 1;
  do {
    if (str[ia] === str[ib]) continue;

    // if spaces skip & retry
    if (str[ia] === ' ' && ib++) continue;
    if (str[ib] === ' ' && ia--) continue;

    return false;
  } while (++ia < --ib);
  return true;
}
var palindrom="never odd or even";
var res = isPalindrom(palindrom);
document.getElementById('check').innerHTML ='"'+ palindrom + '"'+" checked to be :" +res;
<span id="check" />
3
répondu Saffi Hartal 2017-03-14 18:43:15
function checkPalindrom(palindrom)
{
  palindrom= palindrom.toLowerCase();
   var flag = true;
   var j;
   j = (palindrom.length) -1 ;
   //console.log(j);
   var cnt = j / 2;
   //console.log(cnt);
    for( i = 0; i < cnt+1 ; i++,j-- )
    {
        console.log("J is => "+j);
        console.log(palindrom[i] + "<==>" + palindrom[j]);
        if( palindrom[i] != palindrom[j] )
        {
           flag = false;
           break; 
        }


    }
  if( flag ) {
  console.log('the word is palindrome.');
  }
  else {
console.log('the word is not palindrome.');
  }
}
checkPalindrom('Avid diva');
2
répondu weborion 2015-04-26 23:08:16

je me demande pourquoi personne n'a suggéré ceci:

ES6:

// "aba" -> true
// "acb" -> false
// "aa" -> true
// "abba" -> true
// "s" -> true
isPalindrom = (str = "") => {
  if (str[0] === str[str.length - 1]) {
    return str.length <= 1 ? true : isPalindrom(str.slice(1, -1))
  }

  return false;
}

alert(["aba", "acb", "aa", "abba", "s"].map((e, i) => isPalindrom(e)).join())

ES5:

// "aba" -> true
// "acb" -> false
// "aa" -> true
// "abba" -> true
// "s" -> true
function isPalindrom(str) => {
  var str = typeof str !== "string" ? "" : str;

  if (str[0] === str[str.length - 1]) {
    return str.length <= 1 ? true : isPalindrom(str.slice(1, -1))
  }

  return false;
}

alert(["aba", "acb", "aa", "abba", "s"].map(function (e, i) {
    return isPalindrom(e);
}).join());
2
répondu elad.chen 2016-06-02 12:32:08

Méthode Récursive:

var low;
var high;
var A = "abcdcba";  

function palindrome(A , low, high){
  A = A.split('');

 if((low > high) || (low == high)){
   return true;
 }

 if(A[low] === A[high]){
   A = A.join('');
   low = low + 1; 
   high = high - 1; 
   return palindrome(A , low, high);
 }
 else{
   return "not a palindrome";
 }
}

palindrome(A, 0, A.length-1);
2
répondu Rohit 2016-06-22 09:09:43

j'ai pensé que je partagerais ma propre solution:

function palindrome(string){
    var reverseString = '';
    for(var k in string){
       reverseString += string[(string.length - k) - 1];
    }
  if(string === reverseString){
    console.log('Hey there palindrome');
  }else{
    console.log('You are not a palindrome');
  }
}
palindrome('ana');

Hope aidera quelqu'un.

2
répondu Ionut 2016-10-13 16:20:10

j'ai trouvé ceci sur un site d'interview:

écrire une fonction efficace qui vérifie si une permutation d'un la chaîne de saisie est un palindrome. Vous pouvez ignorer les signes de ponctuation, nous ne de soins sur les personnages.

en jouant avec, j'ai trouvé ce moche morceau de code:)

function checkIfPalindrome(text) {
    var found = {};
    var foundOne = 0;
    text = text.replace(/[^a-z0-9]/gi, '').toLowerCase();
    for (var i = 0; i < text.length; i++) {
        if (found[text[i]]) {
            found[text[i]]++;
        } else {
            found[text[i]] = 1;
        }
    }
    for (var x in found) {
        if (found[x] === 1) {
            foundOne++;
            if (foundOne > 1) {
                return false;
            }
        }
    }
    for (var x in found) {
        if (found[x] > 2 && found[x] % 2 && foundOne) {
            return false;
        }
    }
    return true;
}

je le laisse ici pour la postérité.

1
répondu Rudy 2016-02-10 12:57:20

Que Diriez-vous de ceci, en utilisant un simple drapeau

function checkPalindrom(str){
   var flag = true;
   for( var i = 0; i <= str.length-1; i++){
    if( str[i] !== str[str.length - i-1]){
      flag = false;  
     }
    }
    if(flag == false){
      console.log('the word is not a palindrome!');   
    }
    else{
    console.log('the word is a palindrome!');
    }
}

checkPalindrom('abcdcba');
1
répondu Rohit 2016-06-09 08:48:10

(JavaScript) en utilisant regexp, ceci vérifie la présence de palindrome alphanumérique et ne tient pas compte de l'espace et de la ponctuation.

function palindrome(str) {
  str = str.match(/[A-Za-z0-9]/gi).join("").toLowerCase();
  //  (/[A-Za-z0-9]/gi) above makes str alphanumeric

  for(var i = 0; i < Math.floor(str.length/2); i++) { //only need to run for half the string length 
    if(str.charAt(i) !== str.charAt(str.length-i-1)) { // uses !== to compare characters one-by-one from the beginning and end
      return "Try again.";
    }
  }
  return "Palindrome!";
}
palindrome("A man, a plan, a canal. Panama.");
//palindrome("4_2 (: /-\ :) 2-4"); // This solution would also work on something like this.
1
répondu N Schnupp 2016-09-29 19:20:55

boucle à travers les caractères de chaîne à la fois vers l'avant (i) et vers l'arrière (j) en utilisant un pour boucle. Si à n'importe quel point le caractère à str[i] ne pas égale str[j] - alors ce n'est pas un palindrome. Si nous réussissons à boucler la chaîne, alors c'est un palindrome.

function isPalindrome(str) {
  var valid = true;

  for(var i = 0, j = str.length - 1; i < str.length; i++, j--) {
    if (str[i] !== str[j]) valid = false; break;
  }

  return valid;
}
1
répondu Mark Murray 2016-11-18 21:20:55
`
function checkPalindrome (str) {
    var str = str.toLowerCase();
    var original = str.split(' ').join('');
    var reversed = original.split(' ').reverse().join('');

  return (original === reversed);
}
`
1
répondu charlchad 2016-12-11 01:30:49

cela évite le regex tout en traitant aussi avec des cordes qui ont des espaces et des majuscules...

function isPalindrome(str) {
    str = str.split("");

    var str2 = str.filter(function(x){ 
        if(x !== ' ' && x !== ',') {
            return x;
        }
    });

    return console.log(str2.join('').toLowerCase()) == console.log(str2.reverse().join('').toLowerCase());
};

isPalindrome("A car, a man, a maraca"); //true
1
répondu alexoviedo999 2016-12-12 04:18:11
function myPolidrome(polidrome){
 var string=polidrome.split('').join(',');
 for(var i=0;i<string.length;i++){
    if(string.length==1){
     console.log("is polidrome");
   }else if(string[i]!=string.charAt(string.length-1)){
     console.log("is not polidrome");
     break;
  }else{
     return  myPolidrome(polidrome.substring(1,polidrome.length-1));
  }
  }
  }
myPolidrome("asasdsdsa");
1
répondu Hrak Gevorgyan 2016-12-23 22:27:34

pense que je vais partager ma solution en utilisant Array.prototype.filtrer.)( filtrer() filtre le tableau basé sur les valeurs booléennes que la fonction renvoie.

var inputArray=["","a","ab","aba","abab","ababa"]
var outputArray=inputArray.filter(function isPalindrome(x){
  if (x.length<2) return true;
  var y=x.split("").reverse().join("");
  return x==y;
})
console.log(outputArray);
1
répondu kirancodify 2016-12-28 21:59:27

ça a marché pour moi.

var number = 8008
number = number + "";
numberreverse = number.split("").reverse().join('');
console.log ("The number if reversed is: " +numberreverse);
if (number == numberreverse)
    console.log("Yes, this is a palindrome");
else
    console.log("Nope! It isnt a palindrome");
1
répondu Mrityunjeyan S 2017-01-13 09:30:39

Voici une solution qui fonctionne même si la chaîne contient des caractères non alphanumériques.

function isPalindrome(str) {
    str = str.toLowerCase().replace(/\W+|_/g, '');
    return str == str.split('').reverse().join('');
}
1
répondu Valery Melou 2017-02-02 17:44:04

écrire le code pour vérifier les palindromes en suivant les meilleures pratiques de JavaScript:

(function(){
	'use strict';
	
	var testStringOne = "Madam";
	var testStringTwo = "testing";
	var testNull = null;
	var testUndefined;
	
	console.log(checkIfPalindrome(testStringOne));
	console.log(checkIfPalindrome(testStringTwo));
	console.log(checkIfPalindrome(testNull));
	console.log(checkIfPalindrome(testUndefined));
	
	function checkIfPalindrome(testStringOne){
		
		if(!testStringOne){
			return false;
		}
		
		var testArrayOne = testStringOne.toLowerCase().split("");
		testArrayOne.reverse();
		
		if(testArrayOne.toString() == testStringOne.toLowerCase().split("").toString()){
			return true;
		}else{
			return false;
		}
	}
	
})();
1
répondu Pritam Banerjee 2017-07-05 08:35:57

utilisant la récursion:

function isPalindromeRecursive(str) {
  const isLessThan2 = str.length < 2;
  const firstAndLastEqual = str.slice(0, 1) === str.slice(-1);
  return !isLessThan2 && firstAndLastEqual 
    ? isPalindromeRecursive(str.slice(1, -1)) 
    : isLessThan2;
}
1
répondu aashah7 2017-09-23 22:59:46