LeetCode(周赛)2264:最大优质整数问题(简单)

128 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

目录

一、题目

二、题目分析

三、我的解题思路

 完整代码

时间复杂度和空间复杂度

四、更优解

时间复杂度和空间复杂度


一、题目

给你一个字符串 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)组成

来源:力扣(LeetCode)
链接:leetcode.cn/problems/la…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、题目分析

        1)  优质整数的长度为3,同样的字符重复次数为3。

        2)  每次获取优质整数时,取最大的优质整数。

三、我的解题思路

        1) 使用双指针定义一个滑动窗口,滑动窗口的长度为3,从左到右,每次滑动一位。

int left=0;

int right=left+2;

        2) 对滑动窗口里元素判断是否相同,left指针不动,right指针持续向左滑动。

while (left != right) {
    // 如果不相等
    if (num.charAt(left) != num.charAt(right)) {
        break;
    } else {
        right--;
    }
}

        3) 窗口向右移动1位。

left++;

 完整代码

 public String largestGoodInteger(String num) {
        int left = 0;
        String target = "";
        while (left < num.length() - 2) {
            int right = left + 2;
            while (left != right) {
                // 如果不相等
                if (num.charAt(left) != num.charAt(right)) {
                    break;
                } else {
                    right--;
                }
            }

            if (num.charAt(left) == num.charAt(right)) {

                if (target.equals("")) {
                    target = num.charAt(left) + "";
                } else {
                    target = Math.max(Integer.parseInt(target), Integer.parseInt(num.charAt(left) + "")) + "";
                }
            }
            left++;
        }

        return target + "" + target + "" + target;

    }

时间复杂度和空间复杂度

        时间复杂度最好的情况为O(N), 即找不到最优质整数且都是不重复的数时,最坏的情况为O(N2), 空间复杂度O(1)。

四、更优解

        因为优质整数最大就是999,我们可以把存在的情况给列举出来,然后从最大的999进行比较,如果包含就返回,如果不包含那么就继续比较888,依次比较完毕即可。

    public String largestGoodInteger(String num) {
        if (num.length()<3){
            return "";
        }
        String[] arr = {"000", "111", "222", "333", "444", "555", "666", "777", "888", "999"};
        for (int i = 9; i >= 0; i--) {
            if (num.contains(arr[i])) {
                return arr[i];
            }
        }
        return "";
    }

时间复杂度和空间复杂度

        时间复杂度最好的情况为O(1), 即第一次就找到了,最坏的情况也是O(N), N为数组的长度, 空间复杂度O(1)。