1 回答
TA贡献1815条经验 获得超13个赞
您无法在javascript中仅通过在比较其他字符串时返回0而不是来实现稳定排序。您将不得不将其索引存储在地图中,然后做出相应的判断。我已经修改了您的代码,如下所示:0
var map = {};
var reorderLogFiles = function(logs) {
logs.forEach(function(value,index){
map[value] = index;
});
return logs.sort(cmp);
}
var cmp = function(a, b) {
let i = a.trim().indexOf(' ');
let j = b.trim().indexOf(' ');
if(isDigit(a[i+1])){
if(isDigit(b[j+1])) return map[a] - map[b];
return 1;
}
if(isDigit(b[j+1])){
return -1;
}
let cond = a.substring(i+1).localeCompare(b.substring(j+1));
if(cond == 0) return a.substring(0,i).localeCompare(b.substring(0,j));
return cond;
}
var isDigit = function(letter) {
return !isNaN(letter);
}
首先,我们使用它的出现索引创建一个字符串映射。
以后,我们用来确定
a
和和何时b
是数字日志。如果两者都是字母日志,则比较忽略标识符的日志。
发生冲突时使用标识符。
您的代码存在如下问题:
// both letter
if (a.substring(i+1) === b.substring(j+1)) {
// start from space, all same, compare key
condi = a.substring(0,i).localeCompare(b.substring(0,j));
//console.log('same', condi, a.substring(0,i), b.substring(0,j));
return condi;
} else {
condi = a.substring(i+1).localeCompare(b.substring(j+1));
//console.log('not same', condi, a.substring(i+1), ' | ', b.substring(j+1));
return condi;
}
在这里,您将比较字母日志而不考虑标识符。但是,假设两者相同(在并列情况下),您无需检查其标识符的字典顺序。此外,首字母字符匹配在通常情况下也不起作用。
解决此问题的最佳方法是将字母日志和数字日志收集在不同的数组中,然后仅对字母日志进行排序,最后附加数字日志。如果许多日志是经过大量测试的数字日志,则这将为您提供更好的平均案例性能。
添加回答
举报