交换长数字中数字的顺序使得长数字为最大值
一、题目描述
给定一个数字,仅交换一次使得数字最大
——————————
输入:3297
输出:9237
——————————
输入:9090
输出:9900
——————————
输入:3000
输出:3000
二、实现思路
- 将输入的长数字转变为数字数组
- 将数组按照降序排列
- 从头到尾开始遍历原数组和排序后的数组
- 当发现遍历到不同的数字a(小的那个)和b(大的那个)
- 从前到后记下a的下标,从后往前找到b的下标
- 将两个位置的数字交换得到最大的数字数组
- 将数组转换为长数字
二、代码示例
代码如下(示例):
var a = -1, b; //声明a和b,用于记录找到不同数字的下标
function searchMaxNum(num) {
var numList = []; //定义一个数组numList,用来存储原数组
var downList = []; //定义一个降序排列的数组
numList = Array.from(num + ""); //将传入的长数字转变为数组,存储在numList
downList = [].concat(numList); //用数组中的拼接方法concat,使得downList为一个空数组和numList的拼接(得到downList = 原数组numList)
downList.sort(function(a, b) {
return b - a;
}); //将downList降序排列,此处b-a大于0的话,证明b>a,那么交换位置
for (var k = 0; k < downList.length; k++) { //遍历数组
if (numList[k] != downList[k]) { //当找到数组中不相同的元素,因为downList是降序排列,因此downList[k]是可以交换的最大数字
a = k; //将下标k的值赋给a
b = numList.lastIndexOf(downList[k]); //在原数组中从后向前遍历,如果找到downList[k],记下下标为b
break; //跳出循环
}
}
if (a != -1) { //如果a不是-1,证明a被更改过,证明找到了可以交换的数字,以下进行三元交换
var temp = numList[a];
console.log("temp:", temp);
numList[a] = numList[b];
numList[b] = temp;
}
return numList.join(''); //将数字数组转换为长数字
}
console.log(searchMaxNum(9090));
总结
这里其实是利用大的数字在前面,就能得到最终数值最大
两个数组,一个降序排列的数组与原数组从前开始遍历(因为前面的位数高),如果相同,证明数组中大的数字就在前面,如果发现有不同的,证明还有大的数字可以往前挪动
只要逻辑上理解好了,这道题目主要考察了数组的几个方法:
1、将字符串转为数组
2、将数组拼接
3、数组的下标遍历
4、数组转换为字符串