美文网首页
LintCode 最大的交换数

LintCode 最大的交换数

作者: Sczlog | 来源:发表于2018-12-18 17:28 被阅读17次

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

    第一版:
    最直接最暴力的一版,荣膺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的话会比较慢。

    相关文章

      网友评论

          本文标题:LintCode 最大的交换数

          本文链接:https://www.haomeiwen.com/subject/iaslkqtx.html