题目
给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。
第一版:
最直接最暴力的一版,荣膺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的话会比较慢。
网友评论