Палиндром в JavaScript - PullRequest
       28

Палиндром в JavaScript

0 голосов
/ 22 ноября 2018

Я пытаюсь написать код, чтобы определить, является ли строка палиндромом.Я делаю строку строчными, убираю пробелы и превращаю ее в массив.Затем я делю его пополам, переворачиваю вторую половину и сравниваю эти два массива, чтобы увидеть, является ли строка палиндромом.Функция не будет записывать true.

let string = "Never odd or even";
let lowerString = string.toLowerCase();
let split = lowerString.split("");
let array = split.filter(noSpaces);

function noSpaces(i) {
  return i !== " ";
}

function checkIfPal() {
  if (array.length % 2 === 1) {
    let firstHalf = array.slice(0, array.length / 2);
    let secondHalf = array.slice(array.length / 2 + 1, array.length);
    let revSecondHalf = [];
    for (let i = secondHalf.length - 1; i > -1; i--) {
      revSecondHalf.push(secondHalf[i]);
    }
    if (firstHalf === revSecondHalf) {
      console.log("true for odd");
    } else {
      console.log("false for odd");
    }
  } else {
    let firstHalf = array.slice(0, array.length / 2);
    let secondHalf = array.slice(array.length / 2, array.length);
    let revSecondHalf = [];
    for (let i = secondHalf.length - 1; i > -1; i--) {
      revSecondHalf.push(secondHalf[i]);
    }
    if (firstHalf === revSecondHalf) {
      console.log("true for even");
    } else {
      console.log("false for even");
    }
  }
}
checkIfPal();

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Существует гораздо более простой способ сделать это.

  1. Вычеркнуть все, что не является буквой или цифрой
  2. Сделать строку строчной буквой
  3. Loopболее половины строки
  4. Сравнить текущую букву с последней буквой минус текущая позиция

function isPalindrome(str) {
    str = str.replace(/[^\w\d]/g, '').toLowerCase();
    const len = str.length;

    for (let i = 0; i < len / 2; i++) {
        if (str[i] !== str[len - 1 - i]) {
            return false;
        }
    }

    return true;
}

console.log(isPalindrome('A man, a plan, a canal, Panama!'));
console.log(isPalindrome('Mr. Owl Ate My Metal Worm'));
console.log(isPalindrome('A Santa Lived As a Devil At NASA'));

И еще есть супер простой, но не очень эффективный способ для длинных строк.

function isPalindrome(str) {
    str = str.replace(/[^\w\d]/g, '').toLowerCase();
    return str === str.split('').reverse().join('');
}

console.log(isPalindrome('A man, a plan, a canal, Panama!'));
console.log(isPalindrome('Mr. Owl Ate My Metal Worm'));
console.log(isPalindrome('A Santa Lived As a Devil At NASA'));
0 голосов
/ 22 ноября 2018

В вашем скрипте вы сравниваете два объекта массива друг с другом, используя ===.

Если переменные в сравнении ссылаются на один и тот же объект массива, то это вернет true.Но если они указывают на два разных объекта массива, даже если их содержимое одинаково, оно всегда вернет false.

. Если вы хотите продолжить использование массивов для сравнения, вам нужно будет проверить, каждый лиэлемент массива тот же.

function compareArrayElements(arr1, arr2) {
    if (arr1.length != arr2.length)
        return false;
    for (var i=0;i<arr1.length;i++) {
        if (arr1[i] != arr2[i])
            return false;
    }
    return true;
}

Теперь, когда у вас есть решение, вы можете оптимизировать его и уменьшить число циклов for.

0 голосов
/ 22 ноября 2018

В этой строке

if (firstHalf === revSecondHalf) {

вы пытаетесь сравнить два массива, но JavaScript не позволяет вам сделать это с ===, поскольку это два разных объекта.Либо join каждый массив со строкой, а затем их сравнение, либо цикл по элементам в одном массиве, сравнивая их с элементами с тем же индексом в другом массиве.

Первый способ проще.

...