javascript - 为什么我的比较评估为假

标签 javascript arrays string character

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

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

最佳答案

代码审查

除了我对你的问题留下的评论之外,你的 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

字符交换

至于字符交换位,你的手上有点问题。什么是合格掉期? Angular 色只能与其最近的邻居交换位置吗?或者可以交换任意两个字符吗?

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 过程开始,该过程返回一个包含交换字符的字符串。可能是这样的……

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 

我相信到最后您可能会在那里找到一个模式。然后我会在 isOneSwapEnough 中使用 charSwap。不过,我会留给您为它编写循环。我可以给你一些框架代码来开始......

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
}

关于javascript - 为什么我的比较评估为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864582/

相关文章:

javascript - 函数作为另一个函数中的方法

javascript - Rhino 功能超出 ECMA 标准?

ios - @lvalue $T 5' is not identical to ' Swift 中的 AnyObject

c - 如何在c中比较二维数组和一维数组?

c - 数组将整个输入文件保存到一个索引? C

javascript - 语法错误 : missing ) after argument list when onClick calling function and passing url as first argument. JavaScript

javascript - 通过根据属性分组来排序 javascript 数组

javascript - api 路由工作错误

c++ - 如何初始化 C++ 中的字符串集?

c++字符串,构建删除字符 'b'并将字符 'a'替换为两个 'd'的函数