我的任务是编写一个字符串比较函数,其结果如下:
"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;
}
}
在展示我的解决方案时(除了在代码中发现错误),我被问到为什么我将字符串转换为小写并将它们存储在参数中,而不是for循环的每次迭代,将字符转换为小写。 所以我的问题是,将字符串转换为小写字母的正确方法是什么,效率更高,或者我提交答案的人只是和我一起玩心灵游戏?
答案 0 :(得分:1)
将整个字符串转换为小写意味着您必须遍历所有字符,即使比较将停在第一个字符差异处。因此,如果您在转换每个角色时进行转换,则只需执行所需的转换即可获得结果。除非这两个字符串相等,否则你总是会以较少的方式进行转换;当它们相等时,你会进行相同数量的转换。
答案 1 :(得分:0)
作为对您的问题的回答,将小写字符串保存到变量中是正确的。如果你在for循环中转换,那么在每次迭代时都会调用toLowerCase()
方法调用,这是低效的。
现在,不确定你是否知道,但javascript有一个类似于strcmp的方法,称为localeCompare()
。因此,代码的替代方法是:
a.toLowerCase().localeCompare(b.toLowerCase());