为什么我的比较评估为假

时间:2016-08-10 05:00:20

标签: javascript arrays string character

我是javascript的新手。我正在写一个函数来检查是否可以通过一对字符的最多一次交换从它获得回文。我遇到的一个问题是我的对象在警报中似乎看起来是正确的,但无论我使用什么操作符,它都会被评估为false。我附上了小提琴

http://jsfiddle.net/sQx4H/89/

我做错了什么?

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

2 个答案:

答案 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
}

快速&amp;肮脏的解决方案

如果输入字符串中有空格或特殊字符,则不起作用,但您的问题没有说明此类标准。所以也许这就是你要找的全部。

必须比较数组以检测回文。

&#13;
&#13;
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;
&#13;
&#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 可能的交换。 (相关:在这种情况下,ntriangular number

你能想出一个生成并检查每个可能的掉期的基本程序吗?

无论哪种方式,我仍然认为你不需要阵列。我将首先编写一个通用的charSwap过程,该过程返回带有交换字符的字符串。这样的事可能......

&#13;
&#13;
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;
&#13;
&#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)

我认为这可能与您尝试进行直接数组比较的事实有关。下面的方法会变为真,但我不确定它是不是你想要的。

jsfiddle

if (JSON.stringify(firstcheck) == JSON.stringify(testString)) {
    return true;
}