【问题标题】:JS How to for palindrome [duplicate]JS如何处理回文[重复]
【发布时间】:2018-12-22 11:44:15
【问题描述】:

我得到的问题是这样的;

创建一个函数,该函数接受一个单词数组并返回一个仅包含回文的数组。

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([]);
 });
});

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

【问题讨论】:

  • 我不同意这一点,他不是在问如何进行回文检查。他在问他的特定解决方案不起作用。正如我在回答中所说,他只需要将变量 pal 拆分为数组形式即可。

标签: javascript string palindrome


【解决方案1】:

这是最简单的函数,如果 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

【讨论】:

  • 不过,此代码未通过提供的测试。
  • return str.toLowerCase().split('').reverse().join('') === str.toLowerCase(); 可以处理大小写字母混合的单词。
【解决方案2】:

在不破坏答案(这是一个常见的面试问题)的情况下,一个干净的方法如下:

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

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

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

【讨论】:

    【解决方案3】:
        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));
    

    【讨论】:

    【解决方案4】:

    使用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)

    【讨论】:

      【解决方案5】:

      为了解决这个问题,我首先创建一个 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)
      

      【讨论】:

        【解决方案6】:

        你所拥有的是好的,但是当你这样做时

        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);

        【讨论】:

          猜你喜欢
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-07
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多