说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 10^8]
解题思路
将输入的数字转换为字符串数组,然后对该数组进行排序,得到一个按照从大到小排列的新数组 str。接下来,从头开始比较原数组和新数组中的元素,找到第一个不同的位置 ind。然后,在原数组中找到新数组中该位置的元素最后出现的位置 lastInd。将这两个位置上的元素进行交换。最后,将交换后的数组转换为字符串,再转回数字并返回。
AC代码
/** * @param {number} num * @return {number} */ var maximumSwap = function(num) { num = (num + '').split(''); // 将数字转为字符串,并将每个字符拆分成数组 let str = [...num].sort((a,b)=>b - a); // 对数字排序,从大到小 let ind = 0; while(ind < num.length && num[ind] === str[ind]){ ind++; // 找到第一个不同的位置 } const lastInd = num.lastIndexOf(str[ind]); // 找到要交换的数字在原数字中最后出现的位置 [num[ind],num[lastInd]] = [num[lastInd],num[ind]]; // 交换数字 return +(num.join('')); // 将交换后的数组转为字符串,再转回数字 };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。