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;
}
在這里,您將比較字母日志而不考慮標識符。但是,假設兩者相同(在并列情況下),您無需檢查其標識符的字典順序。此外,首字母字符匹配在通常情況下也不起作用。
解決此問題的最佳方法是將字母日志和數字日志收集在不同的數組中,然后僅對字母日志進行排序,最后附加數字日志。如果許多日志是經過大量測試的數字日志,則這將為您提供更好的平均案例性能。
添加回答
舉報