我是javascript的新手。我正在写一个函数来检查是否可以通过一对字符的最多一次交换从它获得回文。我遇到的一个问题是我的对象在警报中似乎看起来是正确的,但无论我使用什么操作符,它都会被评估为false。我附上了小提琴
我做错了什么?
function isOneSwapEnough() {
inputString = 'aabaa'
var inputStringArray = inputString.split();
if (isPalandrome(inputStringArray))
{
return true;
}
//if we made it this far then the string is not a palendrone yet.
var newCharArray;
for (var j =0; j<inputStringArray.length; j++)
{
newCharArray = inputStringArray;
for (var k =0; k<inputStringArray.length; k++)
{
var tempChar = inputStringArray[j];
newCharArray[j] = newCharArray[k];
newCharArray[k] = tempChar;
if (isPalandrome(newCharArray))
{
return true;
}
}
}
return false;
}
function isPalandrome(testString)
{
var firstcheck = [];
// already a char array... var testStringArray = testString.split();
//check if already a palendrone
for (var i =0; i<testString.length; i++)
{
firstcheck[testString.length-(i+1)] = testString[i];
//console.log(testString[i]);
//console.log(firstcheck[testString.length-i]);
}
//console.log(testString);
//console.log(firstcheck);
//alert("1: " + typeof testString);
//alert("2: " + typeof firstcheck);
alert("condition " + firstcheck.valueOf() === testString.valueOf())
if ( firstcheck.valueOf() == testString.valueOf())
{
return true;
}
}
答案 0 :(得分:2)
除了我在你的问题上留下的评论,你的isPalindrome
程序还有很多内容;我的意见内联......
// `isPalindrome` is a nice function name
// `testString` is a terrible parameter name,
// especially since you're passing in an array
function isPalandrome(testString)
{
// unclear variable name
var firstcheck = [];
// by the end of this loop, firstcheck will be a testString in reverse
// ok, got it
for (var i = 0; i<testString.length; i++)
{
firstcheck[testString.length-(i+1)] = testString[i];
}
// the short version of this code is
var firstcheck = testString.slice(0).reverse()
// this doesn't do what you think it does
// `[1,2,3] === [1,2,3]` is false in javascript
// you cannot compare arrays like that
if ( firstcheck.valueOf() == testString.valueOf())
{
// `if (condition) { return true }` is bad code
// just use `return condition`
return true;
}
// don't worry, you don't have to compare arrays to check for your palindromes
}
如果输入字符串中有空格或特殊字符,则不起作用,但您的问题没有说明此类标准。所以也许这就是你要找的全部。
你不必须比较数组以检测回文。
function isPalindrome(str) {
return str === str.split('').reverse().join('')
}
console.log(isPalindrome('aabaa')) // true
console.log(isPalindrome('racecar')) // true
console.log(isPalindrome('risetovotesir')) // true
console.log(isPalindrome('sorry but not a palindrome')) // false
&#13;
至于字符交换位,你手上有点问题。什么是符合条件的掉期?角色是否只能与其直接邻居进行交易?或者可以交换任何两个字符吗?
input | posssibile swaps
------+------------------------------------------------------------
a |
ab | ba
abc | bac cba acb
abcd | bacd cbad dbca acbd adcb abdc
abcde | bacde cbade dbcae ebcda acbde adcbe aecdb abdce abedc abced
如您所见,可能的互换增长迅速。总可能的掉期可以计算为
((n - 1) * n / 2), where n = length of input
例如,字符串长度 5 将有 10 可能的交换......
((5 - 1) * 5 / 2) = 10
字符串长度 20 将具有 190 可能的交换。 (相关:在这种情况下,n
是triangular number)
你能想出一个生成并检查每个可能的掉期的基本程序吗?
无论哪种方式,我仍然认为你不需要阵列。我将首先编写一个通用的charSwap
过程,该过程返回带有交换字符的字符串。这样的事可能......
function charSwap(str, x, y) {
function slice(from,to) {
return str.substring(from,to)
}
let a = str[x], b = str[y]
return slice(0,x) + b + slice(x+1,y) + a + slice(y+1)
}
console.log(charSwap('abcde',0,1)) // bacde
console.log(charSwap('abcde',0,2)) // cbade
console.log(charSwap('abcde',0,3)) // dbcae
console.log(charSwap('abcde',0,4)) // ebcda
console.log(charSwap('abcde',1,2)) // acbde
console.log(charSwap('abcde',1,3)) // adcbe
console.log(charSwap('abcde',1,4)) // aecdb
console.log(charSwap('abcde',2,3)) // abdce
console.log(charSwap('abcde',2,4)) // abedc
console.log(charSwap('abcde',3,4)) // abced
&#13;
我确定你最终可能会在那里找到一个模式。然后我会在charSwap
中使用isOneSwapEnough
。我会把它留给你为它编写循环。我可以给你一些骨架代码来开始...
function isOneSwapEnough(str) {
// setup loop
// let x and y be variables for character indexes to swap
// begin loop
if (isPalindrome(charSwap(str, x, y)))
return true
else
// continue loop
// end loop
return false
}
答案 1 :(得分:-1)
我认为这可能与您尝试进行直接数组比较的事实有关。下面的方法会变为真,但我不确定它是不是你想要的。
if (JSON.stringify(firstcheck) == JSON.stringify(testString)) {
return true;
}