求助|华为外包机考 | 数青蛙变种题-数大雁
3942
2024.09.24
2025.01.25
发布于 广东

Leetcode类似题

数青蛙

题目描述

一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。

具体的:

1.大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”。

2.大雁会依次完整发出”quack”,即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数(这句话就是和数青蛙的区别)

3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。

4.一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 1000


用例

输入输出
quackquack1
qaauucqckk-1
quacqkuac1
qququaauqccauqkkcauqqkcauuqkcaaukccakkck5
quacqkquack1
kaukkkqkcqukckqcqkcaqquckccaqauckuuakcuakacaccquqaaqucquk2
qququaauqccauqkkcauqqkcauuqkcaaukccakkck5
qkkukqkqqaqqkuacauqccakkcuuacuuqccqqkkcucqcaqqckcuaaqkcaacukuucqqaaqkcuuuaukuquucuaackcaqacckakckkcaqkkqkaqckkakucaucucuackauaukuqckkqqquucqqqqkaqkcckaukccuukqccukackaaaqqkqckauququkkkcuqaukccukkkcqakqqucckccqucaqkkkcququcaquqckqkquauqkqqkkcacqkcqcaqcckaquackkkuucuauqqckcqqqukqkccqkakaukqaqcqaqkuaakukqqucuauuckqquqqkqcakcqukccqkuuauaqkqkuuqaquauacaukckkcaquqakuaaqukackaccauuqkquaccakccckckuccqauaqqqakqcuckkucuckaqqqqquuckkaccacucaacaauquaaukkquacakqkauccucqaakcacaucqcucuckukqakquaqucackacukkquucukukkkkcuqucckcuaquuakuukuckackaqqauaauqccucqaaaaqqkquaaqukqakaaccuqukaaqqauauqkuqckcaqakkuukqkquauqcucqacqqauuuukcauukcuuckckqkcaucuuuckqauukqkackucuaqkukqckucckuqqakcuquqaucqqauuquaaukkaaaaaqquuaqkuckuuaacuaccuaqaaakuaacqqcaaqauqqucaukkkccquacacckuaaaaauuuqcukqakakkkuqaqaqaakucckuakqqcaqucuqqaqkaakqqcqquqauccquaakuukccuaqcacckcquucuakkquakqaqucaaaaqckuucqqcqckkqaauuqukkkuuucaaucaaqkaqqqccquqkuaqkcacqqqucccckcqquauakqkqucaakukcuqckcqakaaauquckqauukqaukauqaaqakcukckuckakacackkucaqckcakckuakqucuu19

借鉴别人的代码(java版)

class Solution {
    public int minNumberOfGeese(String s) {
        char[] quacks = s.toCharArray();

        int count = 0;
        while (find(quacks)) {
            count++;
        }

        // 如果没有找到一只大雁返回-1。
        return count == 0 ? -1 : count;
    }

    public boolean find(char[] arr) {
        // 是否有完整找到至少一个quack
        boolean isFind = false;

        // indexes存q u a c k在原数组中对应的下标
        int[] indexes = new int[5];
        // 下一个应该要找的字母
        char nextNeed = 'q';
        // 遍历原数组
        for (int i = 0; i < arr.length; i++) {
            // 如果存在0, 说明进入过下面第5个分支(当arr[i]==k && nextNeed=='k'时), 直接跳过
            if (arr[i] == 0) continue;

            // 如果遍历到q, 并且正好需要q, 则更新下一个需要的字母为u, 并记录下q的下标
            if (arr[i] == 'q' && nextNeed == 'q') {
                nextNeed = 'u';
                indexes[0] = i;
            }
            // 如果遍历到u, 并且正好需要u, 则更新下一个需要的字母为a, 并记录下u的下标
            else if (arr[i] == 'u' && nextNeed == 'u') {
                nextNeed = 'a';
                indexes[1] = i;
            }
            // 如果遍历到a, 并且正好需要a, 则更新下一个需要的字母为c, 并记录下a的下标
            else if (arr[i] == 'a' && nextNeed == 'a') {
                nextNeed = 'c';
                indexes[2] = i;
            }
            // 如果遍历到c, 并且正好需要c, 则更新下一个需要的字母为k, 并记录下c的下标
            else if (arr[i] == 'c' && nextNeed == 'c') {
                nextNeed = 'k';
                indexes[3] = i;
            }
            // 如果遍历到k, 并且正好需要k, 则更新下一个需要的字母为q, 并记录下k的下标
            // 说明此时已经找到quack5个字母了, 将原数组的对应下标全部更新为0, 并更新isFind为true
            else if (arr[i] == 'k' && nextNeed == 'k') {
                nextNeed = 'q';
                indexes[4] = i;
                for (int index : indexes) arr[index] = 0;
                isFind = true;
            }
        }
        return isFind;
    }
}
评论 (28)