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

}
相关推荐
无限码力1 天前
华为OD机试真题 - 求幸存数之和 (C++ & Python & JAVA & JS & GO)
华为od·华为od机考·华为od机试·华为od上机考试·华为od机考真题·华为od-求幸存数之和
无限码力2 天前
华为OD机试双机位C卷 - 结对编程 (C++ & Python & JAVA & JS & GO)
华为od·华为od机考·华为od机试·华为od机试双机位c卷·华为od机考双机位c卷·华为od上机考试·华为od机试-结对编程
无限码力5 天前
华为OD机试双机位C卷统一考试题库清单(持续收录中)以及考点说明
华为od·华为od机考·华为od机试·华为od机试双机位c卷·华为od机考双机位c卷·华为od双机位c卷·华为od上机考试 双机位c卷
无限码力5 天前
华为OD机试真题 - 没有回文串 (C++ & Python & JAVA & JS & GO)
华为od·华为od机试真题·华为od机试·od机考·华为od上机考试·华为od-没有回文串
无限码力7 天前
华为OD机考真题 -【测试用例执行计划】 (C++ & Python & JAVA & JS & GO)
华为od·华为od机考·华为od机试真题·华为od机试·华为od上机考试·华为od机考真题
开开心心_Every8 天前
无广告干扰:简单好用文字LOGO设计工具
xml·java·网络·数据库·华为od·华为云·excel
我是华为OD~HR~栗栗呀9 天前
(华为od)21届-Python面经
java·前端·c++·python·华为od·华为·面试
无限码力9 天前
华为OD机试双机位C卷 - 采样过滤 (C++ & Python & JAVA & JS & GO)
华为od·华为od机考·华为od机试·华为od机试双机位c卷·华为od上机考试·华为od机考真题·华为od机试-采样过滤
Tony_yitao14 天前
15.华为OD机考 - 执行任务赚积分
数据结构·算法·华为od·algorithm
无限码力15 天前
华为OD机试真题 - 最长广播响应 (C++ & Python & JAVA & JS & GO)
华为od·华为od机试·od机考·华为od上机考试真题·华为od机试-最长广播响应·华为od-最长广播响应