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

}
相关推荐
嵌入式学习菌4 天前
【AI面板识别】
华为od
小林rr7 天前
【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·华为od
郝晨妤7 天前
[HarmonyOS]鸿蒙(添加服务卡片)推荐商品 修改卡片UI(内容)
华为od·华为·harmonyos·鸿蒙
油泼辣子多加10 天前
【华为OD机考】华为OD笔试真题解析(7)--基站维修工程师
算法·华为od
CodeClimb13 天前
【华为OD-E卷 - 120 分割数组的最大差值 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
执着的小火车14 天前
【2024华为OD-E卷-100分-箱子之字形摆放】((题目+思路+Java&C++&Python解析)
java·数据结构·算法·华为od
执着的小火车16 天前
【2024华为OD-E卷-100分-日志排序】((题目+思路+Java&C++&Python解析)
数据结构·算法·华为od·华为
CodeClimb16 天前
【华为OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
无限码力16 天前
最大矩阵的和
数据结构·算法·华为od·笔试·华为od e卷真题
CodeClimb18 天前
【华为OD-E卷 - 115 数组组成的最小数字 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od