Palindrome检查Javascript

emc*_*e22 43 javascript

我有以下内容:

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');
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?我想检查这个词是否是回文.

dfs*_*fsq 154

也许我会建议更好的解决方案:

function checkPalindrom (str) {
  return str == str.split('').reverse().join('');
}
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串有空格或标点,你需要一些额外的代码,fyi (5认同)
  • 这显然是最简单的代码,尽管可能不是最有效的解决方案(http://jsperf.com/is-palindrome/3).但是对于像原始代码那样编写代码的人来说,对于一个好的解决方案而言,简单的步骤可能比向一个伟大的解决方案的飞跃更好的帮助? (4认同)
  • 你是对的.我的变体不是教OP如何编程(还有其他5个与这个原始问题更相关的好答案),我只是展示了解决问题的不同方法.发明非显而易见的方式的能力也非常重要. (3认同)

Jas*_*ing 33

比标准答案快25倍

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

使用如下:

isPalindrome('racecar');
Run Code Online (Sandbox Code Playgroud)

因为它定义了"我"本身

小提琴:http://jsfiddle.net/namcx0yf/9/

这比下面的标准答案快〜25倍.

function checkPalindrome(str) {
  return str == str.split('').reverse().join('');
}
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/t0zfjfab/2/

查看性能结果的控制台.

虽然解决方案难以阅读和维护,但我建议您理解它以通过递归和位移来展示非分支,以打动您的下一位面试官.

解释

|| 和&&用于控制流程,如"if""else".如果还剩下|| 是真的,它只是退出真实.如果||的某些内容是假的 它必须继续下去.如果&&的某些内容为false,则退出为false,如果&&的某些内容为true,则必须继续.这被认为是"非分支",因为它不需要if-else interupts,而只需要进行评估.

1.使用不需要将"i"定义为参数的初始化程序.如果已定义,则将"i"分配给自身,否则初始化为0.始终为false,因此始终评估下一个OR条件.

(i = i || 0) < 0
Run Code Online (Sandbox Code Playgroud)

2.检查"我"是否走了一半,但跳过检查中间的奇数字.这里移位的比特就像2除以最低偶数除2的结果.如果是真的那么就假定它已经完成了回文.如果为false,则评估下一个OR条件.

i >= s.length >> 1
Run Code Online (Sandbox Code Playgroud)

3.根据"i"最初的char和end char进行比较,最终作为邻居或中间char的邻居进行比较.如果错误退出并假设不是回文.如果为true则继续下一个AND条件.

s[i] == s[s.length-1-i]
Run Code Online (Sandbox Code Playgroud)

4.再次调用自身递归,将原始字符串作为"s"传递.由于此时肯定定义了"i",因此它会预先递增以继续检查字符串的位置.返回表示是否回文的布尔值.

isPalindrome(s,++i)
Run Code Online (Sandbox Code Playgroud)

但...

一个简单的for循环仍然是我的花哨答案(又称KISS原则)的两倍快

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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 丑陋的25倍 (33认同)
  • @ChrisHawkes我同意100%.重点是教育语言功能,并在底部提供点,表明普通编程更快更容易查看. (7认同)
  • `isPalindrome('Avid diva'.toLowerCase())`返回`true`. (5认同)
  • 是的,我应该澄清它是非常狡猾和我的头脑:) (3认同)

epa*_*llo 10

第一个问题

= is assign ==是比较

第二个问题,你的逻辑是错误的

palindrom.charAt(palindrom.length)-1
Run Code Online (Sandbox Code Playgroud)

你从charAt中减去一个而不是长度.

第三个问题,它仍然是错误的,因为你没有减少i的长度.


Ado*_*era 10

它对我有用

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);
}
Run Code Online (Sandbox Code Playgroud)


BeR*_*ive 8

这里的逻辑不太正确,您需要检查每个字母以确定该单词是否是回文.目前,您打印多次.做一些像这样的事情:

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");
}
Run Code Online (Sandbox Code Playgroud)

应该打印出它确实是一个回文.


Max*_*Max 8

最短的代码(31个字符)(ES6):

p=s=>s==[...s].reverse().join``
p('racecar'); //true
Run Code Online (Sandbox Code Playgroud)

请记住,短代码不一定是最好的.可读性和效率可能更重要.

  • 为什么空模板字符串``在最后工作?我之前从未见过这种语法,也不明白为什么它在这里工作. (2认同)
  • 因为愚蠢——它比编写 `.join('')` 更短,但为了使代码更短而极大地损害了可读性 (2认同)
  • 这是一个模板文字,(ab) 在这里用来保存两个字符作为括号 -- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals] (2认同)

Sco*_*yet 6

至少有三件事:

  • 您正在尝试测试相等性=,用于设置.你需要用==或测试===.(如果你没有前者的理由,可能是后者.)

  • 您在检查每个字符后报告结果.但是在你检查了足够的字符之前,你不知道结果.

  • 你仔细检查每个字符对,因为你真的只需要检查是否,不管first === last是否last === first.


Wil*_*ney 5

作为一个更清晰的递归函数: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(''));

}
Run Code Online (Sandbox Code Playgroud)