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

}
相关推荐
arnold664 小时前
华为OD E卷(100分)21-传递悄悄话
算法·华为od·深度优先
鸿蒙开天组●6 小时前
华为OD机考题加答案之输出指定位置的数字
数据结构·华为od·华为·harmonyos·鸿蒙
arnold666 小时前
华为OD E卷(100分)22-机器人的活动区域
算法·华为od
arnold666 小时前
华为OD E卷(100分)16-智能成绩表
数据结构·算法·华为od
DC妙妙屋24 天前
11.19.2024刷华为OD
数据结构·链表·华为od
郝晨妤25 天前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙
TangKenny1 个月前
华为刷题笔记--题目索引
笔记·华为od·华为·华为od机试
哪 吒1 个月前
华为OD机试 - 考古问题 - 回溯、全排列问题(Python/JS/C/C++ 2024 C卷 200分)
javascript·python·华为od
傲娇尧1 个月前
华为OD技术一面手撕题
华为od