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

}
相关推荐
塔中妖5 天前
【华为OD】分割数组的最大差值
数据结构·算法·华为od
塔中妖6 天前
【华为OD】数字游戏
算法·游戏·华为od
熊文豪7 天前
【华为OD】找出通过车辆最多颜色
算法·华为od
塔中妖7 天前
【华为OD】环中最长子串2
算法·华为od
熊文豪7 天前
【华为OD】区块链文件转储系统
算法·华为od·区块链
塔中妖7 天前
【华为OD】Linux发行版的数量
linux·算法·华为od
熊文豪7 天前
【华为OD】阿里巴巴找黄金宝箱
算法·华为od
塔中妖7 天前
【华为OD】5G网络建设
网络·5g·华为od
塔中妖8 天前
【华为OD】查找接口成功率最优时间段
算法·链表·华为od
塔中妖8 天前
【华为OD】最大子矩阵和
算法·华为od·矩阵