携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
第307场周赛-力扣
第307场周赛-力扣
306的第二题还算不难,基本把题目读懂了,就可以做出来了,注意会超int,竞赛时间内会把这个输入案例隐藏。第三题第四题就是干瞪眼了,难顶啊!!!
现在介绍这个题。
2384. 最大回文数字
给你一个仅由数字(0 - 9)组成的字符串 num 。
请你找出能够使用 num 中数字形成的 最大回文 整数,并以字符串形式返回。该整数不含 前导零 。
注意:
- 你 无需 使用 num 中的所有数字,但你必须使用 至少 一个数字。
- 数字可以重新排序。
示例 1
输入:num = "444947137"
输出:"7449447"
解释:
从 "444947137" 中选用数字 "4449477",可以形成回文整数 "7449447" 。 可以证明 "7449447" 是能够形成的最大回文整数。
示例 2
输入: num = "00009"
输出: "9"
解释: 可以证明 "9" 能够形成的最大回文整数。 注意返回的整数不应含前导零。
提示:
- 1 <= num.length <= 105
- num 由数字(0 - 9)组成
2.解法
class Solution {
public String largestPalindromic(String num) {
char[] chars = num.toCharArray();
int[] nums = new int[10];
for (int i = 0; i < chars.length; i++) {
int j = chars[i] - '0';
nums[j]++;
}
StringBuffer qian = new StringBuffer();
StringBuffer hou = new StringBuffer();
StringBuffer ling = new StringBuffer();
for (int i = 9; i > 0; i--) {
if (nums[i] > 1) {
for (int j = 0; j < nums[i] / 2; j++) {
qian.append(i);
hou.insert(0,i);
}
}
}
if (qian.length() == 0) {
for (int i = 9; i >= 0; i--) {
if (nums[i] != 0) {
return new String(String.valueOf(i));
}
}
}
for (int i = 0; i < nums[0] / 2; i++) {
ling.append(0);
ling.append(0);
}
int temp = 0;
if(ling.length() % 2 == 0 && ling.length() + qian.length() + hou.length() != num.length()) {
for(int k = 9; k >= 0; k--) {
if(nums[k] % 2==1) {
ling.insert(ling.length() / 2,k);
break;
}
}
}
return qian.toString() +ling.toString()+ hou.toString();
}
}
解析
这个题啊,做的真是又臭又长。思路如下
1.用nums数组,分别统计0-9的个数
2.新建三个StringBuffer,一个记录前一半,一个记录对称的后一半(这两个只包括1到9),还有一个记录中间的部分(只包括0,或者包含一个数字)。
3.遍历9到1的数字nums[i],如果nums[i]大于等于2,就给前面的StringBuffer分一半,给后面的分一半StringBuffer。这样能保证返回的是最大的数。
4.如果此时前面两个字符串里面都没有字符,那说明1-9中,每个字符中只有一个。所以最终返回的值一定是0-9之间的一个,所以从9到0遍历,如果存在这个数,就直接返回。
5.剩下就是在中间添加0,添加2的整数倍,然后遍历9-1如果存在有单个的字符,就添加在中间。如果没有那就看0有没有剩余的单个的,添加在中间即可。
第一题链接如下
[杨小白]_leetcode_第307场周赛-第一题2383. 赢得比赛需要的最少训练时长
3.结束
这个题作为第二题,算是比较简单的了,这个题平常遇到还算要能做出来的,刷题刷题,每天一道,三年1000道!!!!