LintCode 最大的交换数

2018-12-18  本文已影响17人  Sczlog

题目
给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。

第一版:
最直接最暴力的一版,荣膺JS最后一名。好歹AC了

const maximumSwap = function (num) {
    // Write your code here
    var str = num.toString();
    for(var i = 9;i > 0;i --){
        var lp = str.lastIndexOf(i);
        if(lp===-1) continue;
        var temp = str.slice(0,lp);
        for(let j = 0;j<temp.length;j++){
            if(temp[j] < i){
                return parseInt(str.slice(0,j) + i + str.slice(j+1,lp) + temp[j] + str.slice(lp+1));
            }
        }
    }
    return parseInt(num);
}

第二版:
不想当最后一名,所以想了想给了这个方法,在面对大数的时候明显优于第一版,我们总希望把最后一个大数放到第一个比他小的数的位置上,所以我们只需记录每个数第一次出现,然后再从9开始找,有没有比这个数小,且比它出现的早的数存在,存在的话就换上,不存在的话就换上更小的数,直到1为止,如果还没有就把原本的数返回回去。
这个算法JS第一名233

const maximumSwap = function (num) {
    // Write your code here
    var str = num.toString();
    var sup = [];
    for(var i = 0;i < 10;i ++){
        var fp = str.indexOf(i);
        if(fp>=0){
            sup.push({index:i,pos:fp});
        }
    }
    sup.sort((a,b)=>{
        return a.pos - b.pos;
    }); 
    for(var i = 9;i > 0;i --){
        var lp = str.lastIndexOf(i);
        if(lp === -1) {continue;}
        var temp = sup.filter(a=> a.index < i && a.pos< lp )
        if(!temp.length) {continue;}
        var cn = temp[0];
        return parseInt(str.slice(0,cn.pos) + i + str.slice(cn.pos+1,lp) + cn.index + str.slice(lp+1));
    }
    return parseInt(num);
}

这一版的问题应该就剩最后的字符串处理了,感觉用slice的话会比较慢。

上一篇 下一篇

猜你喜欢

热点阅读