前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。具体的:
- 大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个"quack"。
- 大雁会依次完整发出"quack",即字符串中 q、u、a、c、k 这 5 个字母按顺序完整存在才能计数为一只大雁。
- 如果不完整或者没有按顺序则不予计数。
- 如果字符串不是由 q、u、a、c、k字符组合而成,或者没有找到一只大雁,请返回 −1。
输入
输入格式: 一个字符串,包含大雁 quack 的叫声 1≤ 字符串长度 ≤1000,字符串中的字符只有 q、u、a、c、k。
输出
输出格式:输出一个整数,表示大雁的数量。
示例
示例1
输入
quackquack
输出
1
示例2
输入
qaauucqcaa
输出-1
示例3
输入
quacqkuackquack
输出2
示例4
输入
qququaauqccauqkkcauqqkcauuqkcaaukccakkck
输出5
解题思路
- 记录每只大雁的声音状态
- 如果新产生的声音之前有大雁已经鸣叫完,将新声音定义为他再次发出,这样即可算出最小大雁数。
题解
Java实现
java
package huawei.e100;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月13日
*
*/
public class T19{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String line = sc.nextLine();
int count = count(line.trim());
System.out.println();
System.out.println(count);
}
}
static int count(String str) {
String base = "quack";
//{[发声下标,发声次数]}
List<Integer[]> list = new ArrayList<>();
boolean flag = true; // 用于判断是否增加大雁数
for (int i = 0; i < str.length(); i++) {
int indexInBase = base.indexOf(str.charAt(i));
// 去除杂音
if(indexInBase == -1) {
continue;
}
if(indexInBase == 0 && flag) {
Integer[] item = {0,1};
list.add(item);
} else if(indexInBase == 0) {
for(int j=0; j< list.size(); j++) {
if(list.get(j)[0] == 4) {
list.get(j)[0] = 0;
list.get(j)[1] = list.get(j)[1]+1;
break;
}
}
} else {
for(int j=0; j< list.size(); j++) {
if(list.get(j)[0] == indexInBase-1) {
list.get(j)[0] = indexInBase;
break;
}
}
}
// 判断是否有刚刚叫完的
flag = true;
for(int j=0; j< list.size(); j++) {
if(list.get(j)[0] == 4) {
flag = false;
break;
}
}
}
int res = 0;
for(int j=0; j< list.size(); j++) {
if(list.get(j)[0] == 4 || list.get(j)[1] > 1) {
res +=1;
}
}
return res>0? res: -1;
}
}