给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

菜鸡自述
这是学完数据结构后,时隔一年,再次碰算法题,这让我意识到自己的算法问题是相当的薄弱,以后要多练算法题,记此。

题目描述

这是力扣(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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值