菜鸡自述
这是学完数据结构后,时隔一年,再次碰算法题,这让我意识到自己的算法问题是相当的薄弱,以后要多练算法题,记此。
题目描述
这是力扣(LeetCode)的一道算法题,点击进入。
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:给定数字的范围是 [0, 10*8]
解题思路(非最佳)
将数字从大到小排列,与原数字比较,找出第一位置不一样的数。
如2736排序后变为7632,两两对比,第一个数不同,表示7和2交换,得到结果7236。
JS代码如下:
<script>
var maximumSwap = function (num) {
var numlist = [];// 存储每位数字
var listarr = [];// 存储降序排列的数字
var exchangenum = [];//存储要交换的数字
//数字转数组
numlist = Array.from(num + "");
function getAllMax(arr) {
//这样连接可以使得不改变原来的数组
listarr = [].concat(arr);
listarr.sort(function (a, b) {
return b - a;
});
// console.log(arr);
// console.log(listarr);
}
getAllMax(numlist);
function getDifPos() {
var samelength = numlist.length;
//判断哪里开始不同
counter = 0;
for (var k = 0; k < samelength; k++) {
if (listarr[k] != numlist[k]) {
//分别是要交换的索引
exchangenum[0] = k;//小的
exchangenum[1] = numlist.lastIndexOf(listarr[k]); //大的
break;
}
counter++;
}
}
getDifPos();
if (exchangenum && counter != numlist.length) {
var number1 = numlist[exchangenum[0]];
var number2 = numlist[exchangenum[1]];
//用通过索引先找到数字,再分别从两边找到数字,对其进行交换操作
index1 = numlist.indexOf(number1);
index2 = numlist.lastIndexOf(number2);
temp = numlist[index1];
numlist[index1] = numlist[index2];
numlist[index2] = temp;
}
return numlist.join('');
}
maximumSwap(10909091);
</script>