交换长数字中数字的顺序使得长数字为最大值

交换长数字中数字的顺序使得长数字为最大值


一、题目描述

给定一个数字,仅交换一次使得数字最大
——————————
输入:3297
输出:9237
——————————
输入:9090
输出:9900
——————————
输入:3000
输出:3000

二、实现思路

  1. 将输入的长数字转变为数字数组
  2. 将数组按照降序排列
  3. 从头到尾开始遍历原数组和排序后的数组
  4. 当发现遍历到不同的数字a(小的那个)和b(大的那个)
  5. 从前到后记下a的下标,从后往前找到b的下标
  6. 将两个位置的数字交换得到最大的数字数组
  7. 将数组转换为长数字

二、代码示例

代码如下(示例):

		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、数组转换为字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值