我想知道如何在javascript中编写回文程序,输入不同的单词后程序会显示该单词是否是回文。例如,单词“noon”是回文,而“bad”则不是。
提前感谢您。
我想知道如何在javascript中编写回文程序,输入不同的单词后程序会显示该单词是否是回文。例如,单词“noon”是回文,而“bad”则不是。
提前感谢您。
这个函数将删除所有非字母数字字符(标点、空格和符号),并将所有内容转换为小写,以检查回文。
function palindrome(str){
var re = /[^A-Za-z0-9]/g;
str = str.toLowerCase().replace(re, '');
return str == str.split('').reverse().join('') ? true : false;
}
尝试这个
isPalindrome = (string) => {
if (string === string.split('').reverse().join('')) {
console.log('is palindrome');
}
else {
console.log('is not palindrome');
}
}
isPalindrome(string)
这是我想出来的一个(在我失败后的45分钟内)。虽然有一些优化需要进行。编写任何算法时,最好假设false
并根据需要更改逻辑以使其成为true
。
isPalindrome()
:
基本上,为了使这个运行在O(N)(线性)复杂度中,您需要拥有2个迭代器,它们的向量指向彼此。也就是说,一个迭代器从头开始,另一个从尾部开始,每个迭代器向内移动。您可以让迭代器遍历整个数组,并使用条件break
/return
一旦它们在中间相遇,但只给每个迭代器默认长度的一半可能会节省一些工作。
for
循环似乎强制使用更多的检查,所以我使用了while
循环 - 这让我感到不太舒服。
以下是代码:
/**
* TODO: If func counts out, let it return 0
* * Assume !isPalindrome (invert logic)
*/
function isPalindrome(S){
var s = S
, len = s.length
, mid = len/2;
, i = 0, j = len-1;
while(i<mid){
var l = s.charAt(i);
while(j>=mid){
var r = s.charAt(j);
if(l === r){
console.log('@while *', i, l, '...', j, r);
--j;
break;
}
console.log('@while !', i, l, '...', j, r);
return 0;
}
++i;
}
return 1;
}
var nooe = solution('neveroddoreven'); // even char length
var kayak = solution('kayak'); // odd char length
var kayaks = solution('kayaks');
console.log('@isPalindrome', nooe, kayak, kayaks);
true
。所有逻辑应该被反转,以便默认情况下返回false
。我还使用了一种快捷方法String.prototype.charAt(n)
,但我感觉这样做没问题,因为每种语言都本地支持此方法。mid
),并在遍历整个数组时将j
设置为s.length-i
(在i>=j
处中断)(尽管它不会影响我们的时间复杂度)。这是我个人现在在测试中编写的方式,但这更多是可读性的问题。另外,似乎我提到了默认返回false,但这里看起来并没有这样做。感谢你的赞美。 - Cody以下是使用ES6功能检查字符串回文的最佳且健壮的解决方案。
最初的回答:
const str="madam"
var result=[...str].reduceRight((c,v)=>((c+v)))==str?"Palindrome":"Not Palindrome";
console.log(result);
var palindrome = word => word == word.split('').reverse().join('')
const palindrome = word => word == [...word].reverse().join('')
- Hamzeen Hameemfunction pall (word) {
var lowerCWord = word.toLowerCase();
var rev = lowerCWord.split('').reverse().join('');
return rev.startsWith(lowerCWord);
}
pall('Madam');
function isPalindrome(s,i) {
return (i=i||0)<0||i>=s.length>>1||s[i]==s[s.length-1-i]&&isPalindrome(s,++i);
}
这段代码简洁、快速且易于理解。
简述:
解释:这里的isPalindrome
函数接受一个字符串类型的str
参数。
If the above case is false then it moves on to the second if statement and checks that if the character at 0 position of the string is same as character at the last place. It does an inequality test between the both.
str.charAt(0) // gives us the value of character in string at position 0
str.slice(-1) // gives us the value of last character in the string.
function isPalindrome(str){
if (str.length <= 1) return true;
if (str.charAt(0) != str.slice(-1)) return false;
return isPalindrome(str.substring(1,str.length-1));
};
document.getElementById('submit').addEventListener('click',function(){
var str = prompt('whats the string?');
alert(isPalindrome(str))
});
document.getElementById('ispdrm').onsubmit = function(){alert(isPalindrome(document.getElementById('inputTxt').value));
}
<!DOCTYPE html>
<html>
<body>
<form id='ispdrm'><input type="text" id="inputTxt"></form>
<button id="submit">Click me</button>
</body>
</html>
function palindrome(str) {
var lenMinusOne = str.length - 1;
var halfLen = Math.floor(str.length / 2);
for (var i = 0; i < halfLen; ++i) {
if (str[i] != str[lenMinusOne - i]) {
return false;
}
}
return true;
}
针对半字符串解析和常量值变量进行优化。
reverse
的答案不同,但这里的所有答案都是一样的。我故意没有将字符串长度分为两个部分,而是使它更大,以便使用标记算法来区分时间上的差异。 - nanobash function palindrom(s){
s = s.toString();
var f = true; l = s.length/2, len = s.length -1;
for(var i=0; i < l; i++){
if(s[i] != s[len - i]){
f = false;
break;
}
}
return f;
}
console.log(palindrom(12321));