我有以下内容:
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)
Jas*_*ing 33
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/
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)
这里的逻辑不太正确,您需要检查每个字母以确定该单词是否是回文.目前,您打印多次.做一些像这样的事情:
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)
应该打印出它确实是一个回文.
p=s=>s==[...s].reverse().join``
p('racecar'); //true
Run Code Online (Sandbox Code Playgroud)
请记住,短代码不一定是最好的.可读性和效率可能更重要.
至少有三件事:
您正在尝试测试相等性=,用于设置.你需要用==或测试===.(如果你没有前者的理由,可能是后者.)
您在检查每个字符后报告结果.但是在你检查了足够的字符之前,你不知道结果.
你仔细检查每个字符对,因为你真的只需要检查是否,不管first === last是否last === first.
作为一个更清晰的递归函数: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)
| 归档时间: |
|
| 查看次数: |
113080 次 |
| 最近记录: |