刷题——数大雁

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

  1. 大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符串中可能
    会混合多个 “quack”。
  2. 大雁会依次完整发出 “quack”,即字符串中‘q’, ’u’, ’a’, ’c’, ’k’ 这 5个
    字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。
  3. 如果字符串不是由‘q’, ’u’, ’a’, ’c’, ’k’字符组合而成,或者没有找到一
    只大雁,请返回 -1。
    输入描述:
    一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 10000
    字符串中的字符只有’q’, ‘u’, ‘a’, ‘c’, ‘k’
    输出描述:
    大雁的数量
    在这里插入图片描述
#include <iostream>
#include <string>
#include <algorithm>

bool is_str(std::string str)
{
	int times = 0, times1 = 0, times2 = 0, times3 = 0, times4 = 0, times5 = 0;
	for (int i = 0; i < str.size(); i++)
	{
		if (str.at(i) == 'q' || str.at(i) == 'u' || str.at(i) == 'a' || str.at(i) == 'c' || str.at(i) == 'k')
		{
			times++;
		}

		if (str.at(i) == 'q')
		{
			times1++;
		}

		else if (str.at(i) == 'u')
		{
			times2++;
		}

		else if (str.at(i) == 'a')
		{
			times3++;
		}

		else if (str.at(i) == 'c')
		{
			times4++;
		}

		else if (str.at(i) == 'k')
		{
			times5++;
		}
	}

	if(times != str.size() || times1==0 || times2 == 0 || times3 == 0 || times4 == 0 || times5 == 0 || str.size() < 5)
	{
		return false;
	}

	else
	{
		return true;
	}
}

int number(std::string str)
{
	int times = 0;
	for (int i = 0; i < str.size() - 5; i++)
	{
		if (str.at(i) == 'q' && str.at(i+1) == 'u' && str.at(i+2) == 'a' && str.at(i+3) == 'c' && str.at(i+4) == 'k')
		{
			times++;
		}
	}
	std::cout << "N2:" << times+1 << std::endl;
	return times;
}

int count(std::string str)
{
	int times1=0,times2 =0,times3=0,times4=0,times5=0;
	for(int i=0;i<str.size();i++)
	{
		if (str.at(i) == 'q')
		{
			times1++;
		}

		else if (str.at(i) == 'u')
		{
			times2++;
		}

		else if (str.at(i) == 'a')
		{
			times3++;
		}

		else if (str.at(i) == 'c')
		{
			times4++;
		}

		else if (str.at(i) == 'k')
		{
			times5++;
		}
	}

	std::cout << "N1:" << std::max(std::max(std::max(std::max(times1, times2), times3), times4), times5) << std::endl;
	return std::max(std::max(std::max(std::max(times1, times2), times3), times4),times5);
}

int dayan_num(std::string str)
{
	bool flag = is_str(str);

	if (flag == true)
	{
		std::cout << "给出的字符串是有效组合" << std::endl;
		return count(str) - number(str);
	}

	else
	{
		std::cout << "给出的字符串不是有效组合" << std::endl;
		return -1;
	}
}

int main()
{
	std::string str1 = "quackquack";
	std::string str2 = "quqackuack";
	std::string str3 = "quackquuok";
	int N = dayan_num(str1);
	std::cout << "N:" << N << std::endl;
	return 0;
}
华为OD机试 大雁是华为公司招聘流程中的其中一项测试环节,用于考察应聘者在编程方面的能力。该笔试主要考察的是计算机基础知识和编程实战能力。 华为OD机试目通常由一系列算法编程组成,其中涵盖了数据结构算法、字符串操作、动态规划、图论、递归、搜索等各个方面的知识点。考生需要根据目要求,自行设计算法并编写相应的代码,来解决问。 这一环节的目的是为了考察应聘者在编程方面的能力,包括对算法的理解和实现能力、代码质量和效率等方面的评估。编程能力在今天的软件工程领域中十分重要,能够有效地解决实际问,提高代码的可读性和可维护性,是评估一个程序员水平的重要指标。 参加华为OD机试大雁,需要具备扎实的计算机基础知识,熟练掌握编程语言和常用的数据结构算法,并具备理解和分析问的能力。在备战该笔试的过程中,应聘者应该注重对算法的学习和理解,并进行大量的编程实践,深入理解各类算法的原理与应用场景。在解答算法时,可以运用递归、分治、贪心、动态规划等常用思想,将问拆解为更小的子问,从而更好地解决复杂的算法。 华为OD机试大雁是一个对程序员编程能力的一种考察方式,参加者需要通过编写代码解决目,展示自己的编程实力。准备过程中,应聘者应该注意提高自己的算法能力,并进行足够的练习,积累编程经验,从而顺利通过华为OD机试大雁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值