华为OD机试【数大雁】golang实现

82 阅读2分钟

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

具体的:

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

2.大雁会依次完整发出"quack",即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。

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

输入描述

一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 1000,字符串中的字符只有’q’, ‘u’, ‘a’, ‘c’, ‘k’

输出描述

大雁的数量

示例1:

输入:quackquack

输出:1

一只大雁叫了两声

示例2:

输入:quqackuack

输出:2

至少两只大雁各叫了一声quack

示例3:

输入:quackquook

输出:-1

给出的字符串不是quack的有效组合

实例3

输入:quqackuackquack

输出:2

思路:大雁会依次完整发出q u a c k五个字符,因此个字符技术首先要满足countQ > countU > countA > countC > countK,另外因为quackquack算一只大雁叫两声,因此连续的quack,不管出现多少次,都可算做一只大雁叫了多次,判断条件为q的索引位置+4等于k的位置,因此拿出q和k的位置记录,过滤符合这样条件的,剩余的需要多只大雁发出。

golang实现

func StringQuack(in string) int {    var q, k []int    var countU, countA, countC int    for i, v := range in {        switch string(v) {        case "q":            q = append(q, i)        case "u":            if countU < len(q) {                countU++            }        case "a":            if countA < countU {                countA++            }        case "c":            if countC < countA {                countC++            }        case "k":            if countC > 0 {                k = append(k, i)                countU--                countA--                countC--            }        default:            return -1        }        //fmt.Println("Switch countQ, countU, countA, countC, countK", string(v), q, countU, countA, countC, k)    }    var size = len(q)    if len(k) < size {        size = len(k)    }    var res int    var flag bool    for i := 0; i < size; i++ {        if q[i]+4 == k[i] {            flag = true            continue        }        res++    }    if flag && res == 0 {        res++    }    if res == 0 {        return -1    }    fmt.Println("countQ, countU, countA, countC, countK", q, countU, countA, countC, k, res)    return res}

测试代码

func TestStringQuack(t *testing.T) {    type args struct {        in string    }    tests := []struct {        name string        args args        want int    }{        {            name: "test1 quack",            args: args{                in: "quack",            },            want: 1,        },        {            name: "test2 quackquack",            args: args{                in: "quackquack",            },            want: 1,        },        {            name: "test3 quqackuack",            args: args{                in: "quqackuack",            },            want: 2,        },        {            name: "test4 quackquook",            args: args{                in: "quackquook",            },            want: -1,        },        {            name: "test5 quqackuackquack",            args: args{                in: "quqackuackquack",            },            want: 2,        },        {            name: "test6 qququaauqccauqkkcauqqkcauuqkcaaukccakkck",            args: args{                in: "qququaauqccauqkkcauqqkcauuqkcaaukccakkck",            },            want: 8,        },        {            name: "test7 ququackackqakcu",            args: args{                in: "ququackackqakcu",            },            want: 2,        },        {            name: "test8 quacqkuac",            args: args{                in: "quacqkuac",            },            want: 1,        },        {            name: "test9 quacquackquack",            args: args{                in: "quacquackquack",            },            want: 2,        },    }    for _, tt := range tests {        t.Run(tt.name, func(t *testing.T) {            if got := StringQuack(tt.args.in); got != tt.want {                t.Errorf("StringQuack() = %v, want %v", got, tt.want)            }        })    }}