亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

leetcode:渲染日志文件,無法排序

leetcode:渲染日志文件,無法排序

米琪卡哇伊 2021-05-18 17:01:21
我試圖將以下c ++答案(來自上面的討論)轉換為javascript。static bool myCompare(string a, string b){        int i = a.find(' ');        int j = b.find(' ');        if(isdigit(a[i + 1]))            if(isdigit(b[j + 1]))                return false;       // a b are both digit logs, a == b, keep their original order            else                return false;       // a is digit log, b is letter log, a > b        else            if(isdigit(b[j + 1]))                return true;        // a is letter log, b is digit log, a < b            else {                if (a.substr(i) == b.substr(j))                    return a.substr(0,i) < b.substr(0,j); //If string part is the same, compare key                else                    return a.substr(i) < b.substr(j);   // a and b are both letter            }    }    vector<string> reorderLogFiles(vector<string>& logs) {        //The order of equal elements is guaranteed to be preserved in stable_sort.        //Use sort() cannot pass the OJ.         stable_sort(logs.begin(), logs.end(), myCompare);        return logs;    }我的解決方案如下:var reorderLogFiles = function(logs) {    return logs.sort(cmp);}var cmp = function(a, b) {    let i = a.indexOf(' ');    let j = b.indexOf(' ');    if(isdigit(a[i + 1])) {        if(isdigit(b[j + 1])) {            // a, b digit, a == b            return 0;        } else {            // a digit, b letter, b|a            return 1;        }    } else {        let condi;        // a letter, b digit, a|b        if(isdigit(b[j + 1])) {            return -1;        } else {            // 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 {                 }    }}我的輸出與預期輸出之間的差異:"s 1088746413789"
查看完整描述

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;

            }

  • 在這里,您將比較字母日志而不考慮標識符。但是,假設兩者相同(在并列情況下),您無需檢查其標識符的字典順序。此外,首字母字符匹配在通常情況下也不起作用。

  • 解決此問題的最佳方法是將字母日志和數字日志收集在不同的數組中,然后僅對字母日志進行排序,最后附加數字日志。如果許多日志是經過大量測試的數字日志,則這將為您提供更好的平均案例性能。


查看完整回答
反對 回復 2021-05-27
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號