美文网首页
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 最大的交换数

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

  • 乘积最大子序列

    LintCode题目地址找出一个序列中乘积最大的连续子序列(至少包含一个数)。

  • 基础算法-排序

    冒泡排序 从左到右,把大的数字交换到右边,第一遍循环后 最大的数交换到了最右边,第二遍循环把第二大的数交换到了倒数...

  • 选择排序---简单选择排序

    基本思想 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数中再找最小(或者最大...

  • js实现 冒泡排序

    原理:两个相邻的数,进行比较,如果前面的数比后面的数大(或小),则交换位置,直到最大的数(或最小的数)沉底!!【从...

  • lintcode 落单的数(|,||,|||)

    (|)给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。样例给出 [1,2,2...

  • lintcode 丑数

    设计一个算法,找出只含素因子2,3,5 的第 n 大的数。直接寻找丑数,由定义可知,丑数是由2m,3n,5^l,因...

  • 最大交换

    i从高到低遍历,尝试与右边比它最大的数当中离它最远的那个交换。

  • 最大公约数验证及高斯模糊推导

    1.最大公约数验证: 先交换两数练手: Ⅰ.a = a^b; Ⅱ.b = a^b; Ⅲ.a = a^b; 假设原始...

  • 选择排序—简单选择排序

    2018-09-19 思路:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当...

网友评论

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

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