本文最后更新于62 天前,其中的信息可能已经过时,如有错误请发送邮件到3091169959@qq.com
1.题目描述
给你一个字符串 num
,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 :
- 该整数是
num
的一个长度为3
的 子字符串 。 - 该整数由唯一一个数字重复
3
次组成。
以字符串形式返回 最大的优质整数 。如果不存在满足要求的整数,则返回一个空字符串 ""
。
注意:
- 子字符串 是字符串中的一个连续字符序列。
num
或优质整数中可能存在 前导零 。
示例 1:
输入:num = "6777133339" 输出:"777" 解释:num 中存在两个优质整数:"777" 和 "333" 。 "777" 是最大的那个,所以返回 "777" 。
示例 2:
输入:num = "2300019" 输出:"000" 解释:"000" 是唯一一个优质整数。
示例 3:
输入:num = "42352338" 输出:"" 解释:不存在长度为 3 且仅由一个唯一数字组成的整数。因此,不存在优质整数。
提示:
3 <= num.length <= 1000
num
仅由数字(0
–9
)组成
2.题目分析
其实这道题就是简单的通过暴力就可以解决的,常规解法如下:
class Solution {
public String largestGoodInteger(String num) {
// :如果长度小于3,直接返回空字符串
if(num.length() < 3) return "";
char max ='\0';
for(int i = 0;i <=num.length()-3;i++) {
if(num.charAt(i) == num.charAt(i+1) && num.charAt(i+1)== num.charAt(i+2)) {
if(num.charAt(i) > max)
max = num.charAt(i);
}
}
return max == '\0' ? "":new String(new char[] {max,max,max});
}
}
稍微一开始先做个长度的判断进行优化,返回字符串时就构造一个字符串返回。
3.提交结果
今天的每日一题还算简单,非常适合我这种明天考试今天还刷题的人。
4.拓展思路
其实打表也是一个很好的思路,对于数字来说,只有0-9,所以可以直接通过判断当前字符串中是否包含从9-0的三连字符串
class Solution2 {
public String largestGoodInteger(String num) {
for (char c = '9'; c >= '0'; c--) {
String triple = "" + c + c + c;
if (num.contains(triple)) {
return triple;
}
}
return "";
}
}
结果发现这个还不如之前的遍历,问题应该是出现在字典没有写死,进行优化,使用字典(数组)的方式来查找最大的优质整数应该性能会更好。
class Solution2 {
public String largestGoodInteger(String num) {
// 检查输入的有效性
if (num == null || num.length() < 3) return "";
// 定义整数字典,从大到小排列
String[] e = {"999", "888", "777", "666", "555", "444", "333", "222", "111", "000"};
// 遍历字典,找到第一个出现在 num 中的优质整数并返回
for (String goodInt : e) {
if (num.contains(goodInt)) {
return goodInt;
}
}
return "";
}
}
确实实现了100%的用时。
5.总结
最近一段时间有点忙,算法题刷的有点少了,每天都惴惴不安的,思来想去,还是每天抽空写个两题,有助于睡眠质量的提升,今天的题目虽然简单,但是通过对与程序的性能优化的过程,以空间换时间,对于在复杂项目中,多个这种小细节的提升可以极大提高整体的性能和抗压能力。