说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
问题描述
给你一个四位 正 整数 num
。请你使用 num
中的 数位 ,将 num
拆成两个新的整数 new1
和 new2
。new1
和 new2
中可以有 前导 0 ,且 num
中 所有 数位都必须使用。
- 比方说,给你
num = 2932
,你拥有的数位包括:两个2
,一个9
和一个3
。一些可能的[new1, new2]
数对为[22, 93]
,[23, 92]
,[223, 9]
和[2, 329]
。
请你返回可以得到的 new1
和 new2
的 最小 和。
示例 1:
输入: num = 2932 输出: 52 解释: 可行的 [new1, new2] 数对为 [29, 23] ,[223, 9] 等等。 最小和为数对 [29, 23] 的和:29 + 23 = 52 。
示例 2:
输入: num = 4009 输出: 13 解释: 可行的 [new1, new2] 数对为 [0, 49] ,[490, 0] 等等。 最小和为数对 [4, 9] 的和:4 + 9 = 13 。
提示:
1000 <= num <= 9999
思路分析
首先我们应该要先理解一下题目意思,题目会给我们一个四位 正 整数 num
,我们可以对这个整数所有数位进行拆分然后进行重组,我们需要重组得到两个新的整数,并且要使得这两个整数之和最小。这里要使两个整数之和最小,我们需要使得到的两个整数也尽量的小。所以我们应该优先将较小的数字作为新数字的高位,这样得到的数字才会是最小的。
- 将整数
num
进行数位拆分
我们先将整数num
进行数位拆分,并将拆分后的数位数字按大小进行排序。如2932
,我们可以得到数位数组:[2,2,3,9]
。
num += ""; num = num.split("").sort((a, b) => a - b);
- 重组两个新数字
前面我们已经将整数num
进行数位拆分并进行了排序,现在我们只需要交替从得到的数位中取值,将较小的值作为新数字的高位,这样我们可以得到两个最小的新数字,对其进行求和即可。
let num1 = "", num2 = ""; while (num.length) { num1 = num.pop() + num1; if (num.length == 0) break; num2 = num.pop() + num2; }
AC 代码
完整 AC 代码如下:
/** * @param {number} num * @return {number} */ var minimumSum = function (num) { num += ""; num = num.split("").sort((a, b) => a - b); let num1 = "", num2 = ""; while (num.length) { num1 = num.pop() + num1; if (num.length == 0) break; num2 = num.pop() + num2; } return parseInt(num1) + parseInt(num2); };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。