2017-05-14 63 views
0

我写一个字符串比较函数,其中结果如下任务:
串字符迭代Efficency在JavaScript

"ABC" & "abc" returns 0; 
"abc" & "abcd" return -1; 
"abcd" & "abc" returns 1; 

我的解决办法是:

function strcmp(a,b){ 
    var aTemp = a.toLowerCase(); 
    var bTemp = b.toLowerCase(); 
    if(aTemp === bTemp){ 
    return 0; 
    } else { 
    for(var i = 0; i < aTemp.length;i++){ 
     var charAtA = aTemp.charCodeAt(i), charAtB = bTemp.charCodeAt(i); 
     if(charAtB !== charAtB) // NaN returns false when compared to itself. 
     return 1; 
     if(charAtA < charAtB) 
       return -1; 
     else if(charAtA > charAtB) 
     return 1; 
    } 
    if(bTemp.length > aTemp.length) 
     return -1; 
    return 0; 
    } 
} 

当呈现我的解决方案(除了在代码中发现bug之外),我被问到为什么我将字符串转换为小写字母并将它们存储在参数中,而不是for循环的每次迭代中,将字符转换为小写。 所以我的问题是,将字符串转换为小写字母,更有效率,还是我提交答案只是与我一起玩智力游戏的人的正确方法是什么?

+0

'“abc”&“abd”'的输出是什么? – Kroltan

+0

似乎过于复杂? - > ** https://jsfiddle.net/adeneo/1w7kudsj/** – adeneo

+0

@adeneo你的小提琴为'strcmp(“fooABC”,“oabc”)返回1# – Barmar

回答

1

转换整个字符串转换为小写意味着你必须遍历所有的字符,即使比较将在第一个字符差异停止。因此,如果您按照每个字符进行转换,则只需执行尽可能多的转换即可获得结果。除非这两个字符串是平等的,否则您总是会以这种方式进行较少的转换;当他们平等时,您可以进行相同数量的转化。

+0

谢谢你回答这个问题。 –

0

作为对您的问题的回答,您将小写字符串保存到变量中是正确的。如果你在for循环内部进行了转换,那么在每次迭代时,toLowerCase()方法就会被调用,这是低效的。

现在,不知道您是否知道,但JavaScript有一个类似于strcmp的方法,名为localeCompare()。所以,你的代码的替代将是这样:

a.toLowerCase().localeCompare(b.toLowerCase());