华为OD E卷(100分)19-数大雁

前言

工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

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

  1. 大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个"quack"。
  2. 大雁会依次完整发出"quack",即字符串中 q、u、a、c、k 这 5 个字母按顺序完整存在才能计数为一只大雁。
  3. 如果不完整或者没有按顺序则不予计数。
  4. 如果字符串不是由 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

解题思路

  1. 记录每只大雁的声音状态
  2. 如果新产生的声音之前有大雁已经鸣叫完,将新声音定义为他再次发出,这样即可算出最小大雁数。

题解

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;
	}

}
相关推荐
熬了夜的程序员13 天前
【华为机试】208. 实现 Trie (前缀树)
数据结构·算法·华为od·华为
哪 吒21 天前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷
熬了夜的程序员23 天前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
哪 吒1 个月前
【2025B卷】华为OD机试九日集训第2期 - 按算法分类,由易到难,提升编程能力和解题技巧(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
蜗牛的旷野1 个月前
华为OD机试_2025_查找单入口空闲区域(Python,100分)(附详细解题思路)
python·算法·华为od
_不会dp不改名_1 个月前
华为OD 二维伞的雨滴效应
华为od
_不会dp不改名_1 个月前
华为OD 数字游戏
华为od
YOLO大师2 个月前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
哪 吒2 个月前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
蜗牛的旷野2 个月前
华为OD机试_2025 B卷_矩形相交的面积(Python,100分)(附详细解题思路)
开发语言·python·华为od