文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
LCR 164. 破解闯关密码 - 力扣(LeetCode)
2. 题目大意
描述:给定一个非负整数数组 nums。
要求:将数组中的数字拼接起来排成一个数,打印能拼接出的所有数字中的最小的一个。
说明:
- 0<nums.length≤100。
- 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
- 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0。
3. 示例
输入: [10,2]
输出: "102"
输入:[3,30,34,5,9]
输出:"3033459"
4. 解题思路
本质上是给数组进行排序。假设 x、y 是数组 nums 中的两个元素。则排序的判断规则如下所示:
- 如果拼接字符串 x+y>y+x,则 xx 大于 y,y 应该排在 x 前面,从而使拼接起来的数字尽可能的小。
- 如果拼接字符串 x+y<y+x,则 x 小于 y,x 应该排在 y 前面,从而使拼接起来的数字尽可能的小。
5. 参考代码
class Solution {public String crackPassword(int[] password) {// 将整数数组转换为字符串数组String[] numsStr = new String[password.length];for (int i = 0; i < password.length; i++) {numsStr[i] = String.valueOf(password[i]);}// 使用自定义比较器对字符串数组进行排序Arrays.sort(numsStr, new Comparator<String>() {@Overridepublic int compare(String a, String b) {// 直接比较连接结果的大小return (a + b).compareTo(b + a);}});// 使用 StringBuilder 拼接字符串StringBuilder result = new StringBuilder();for (String str : numsStr) {result.append(str);}return result.toString();}}