JS如何回文

时间:2018-12-22 11:44:15

标签: javascript string palindrome

我得到的问题是这个;

创建一个使用单词数组并返回仅包含回文的数组的函数。

palindrome是向后拼写相同的单词。

  E.g. ['foo', 'racecar', 'pineapple', 'porcupine', 'pineenip'] => ['racecar', 'pineenip']

这是我创建的代码;

let arr = []
let str = words.slice(0)
let pal = str.toString().split("").reverse().join("") 
console.log(pal);


for (let i = 0; i < words.length; i++) {
for (let k = 0; k < pal.length; k++) {
 if (words[i] == pal[k]) {
   arr.push(words[i])
 }
 }
 }
 return arr
 }

这是运行我的代码的测试;

describe("findPalindromes", () => {
it("returns [] when passed []", () => {
expect(findPalindromes([])).to.eql([]);
});
it("identifies a palindrom", () => {
 expect(findPalindromes(["racecar"])).to.eql(["racecar"]);
 });
it("ignores non-palindromes", () => {
expect(findPalindromes(["pineapple", "racecar", "pony"])).to.eql([
  "racecar"
]);
 });
 it("returns [] when passed no palindromes", () => {
expect(findPalindromes(["pineapple", "watermelon",      "pony"])).to.eql([]);
 });
});

有人对如何使我的代码正常工作有任何建议吗?

6 个答案:

答案 0 :(得分:2)

这是最简单的函数,如果str是否为回文,则返回true或false。 我将其与过滤功能结合使用以对所有回文进行过滤。像这样

function checkPalindrom(str) { //function that checks if palindrome or not
    return str == str.split('').reverse().join('');
}

const result = words.filter(word => checkPalindrom(word)); //filter function that filters array to only keep palindromes

答案 1 :(得分:0)

    function isPalindrome(word) {
        const firstHalf = word.slice(0, Math.ceil(word.length/2));
        const secondHalfReversed = word.slice(Math.floor(word.length/2)).split('').reverse().join('');

        return firstHalf === secondHalfReversed;
    }

    function getPalindromesFromArray(arr) {
        return arr.filter(isPalindrome);
    }

    const wordsArr = ['foo', 'racecar', 'pineapple', 'porcupine', 'pineenip'];

    console.log(getPalindromesFromArray(wordsArr));

答案 2 :(得分:0)

在不破坏剧情的情况下(这是常见的访谈问题),一种干净的方法如下:

  1. 定义一个函数isPalindrome(string): boolean
  2. 使用Array原型上可用的filter属性返回仅包含回文的数组,例如inputArray.filter(isPalindrome)

两者都可以单独进行单元测试,例如:

您可以为isPalindrome [{ input: "racecar", expectedOutput: true}, {input: "pineapple", expectedOutput: false}, ...]定义输入和期望输出的数组,并遍历每个测试用例。

答案 3 :(得分:0)

使用for循环和filter

let arr = ["foo", "racecar", "pineapple", "porcupine", "pineenip",'pap','aaaa'];
let palindromes = arr.filter(w => {
  let len = w.length;
  for (let i = 0; i < len / 2; i++) {
    if (w[i] == w[len - i - 1]) {
      return true;
    } else {
      return false;
    }
  }
});
console.log(palindromes)

答案 4 :(得分:0)

首先要解决这个问题,我将创建一个isPalindrome函数,如下所示:

function isPalindrome(word) {
  palindromeWord = ''
  for(var i = word.length - 1; i >= 0; i--) {
    palindromeWord += word.charAt(i)
  }

  return palindromeWord === word
}

,然后我将像这样检查数组中的每个单词:

let arr =  ['foo', 'racecar', 'pineapple', 'porcupine', 'pineenip']

let palindromeArr = []

arr.forEach(word => {
  if (isPalindrome(word)) {
    palindromeArr.push(word)
  }
})

console.log(palindromeArr)

答案 5 :(得分:0)

您拥有的东西很好,但是当您拥有

var pal = str.toString().split("").reverse().join("")

您从数组更改为字符串,然后进入字符串循环,因此pal [k]给出了一个字符而不是一个单词。

要将pal改回字符串数组,请再次将其拆分,使用

var pal = str.toString().split("").reverse().join("").split(",");

var words = ['foo', 'racecar', 'pineapple', 'porcupine', 'pineenip'];

var arr = [];
var str = words.slice(0);
var pal = str.toString().split("").reverse().join("").split(",");
console.log(pal);


for (let i = 0; i < words.length; i++) {
  for (let k = 0; k < pal.length; k++) {
    if (words[i] == pal[k]) {
      arr.push(words[i])
    }
  }
}


console.log(arr);