华为20170317实习机试答案

本文介绍了一个有趣的算法问题——如何通过一串01序列来计算能够集齐‘五福’的最多套数,同时提供了一种解决方法。此外,还探讨了后缀表达式的计算实现,包括如何利用栈结构处理后缀表达式中的操作数和运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五福

#include<iostream>
#include<string>
//集齐五福多少套
//给出0 1 序列
using namespace std;
int fu(string &str){
	//cout << str << endl;
	int matrix[6]={0};
	//int people_num = 1;
	int fu_num = 1;
	for (auto i : str){
		if (i == '1')
		{
			//cout << 'i ' << i << endl;
			matrix[fu_num] = matrix[fu_num] + 1;
			fu_num = fu_num + 1;
		}
		else if (i == '0')
		{
			fu_num = fu_num + 1;
		}
		else{
			fu_num = 1;
			continue;
		}	
	}
	int min_num = matrix[1];
	for (int j = 1; j < 6; j++){
		if (min_num > matrix[j]){
			min_num =  matrix[j];
		}
		cout << matrix[j] << endl;
	}
	return min_num;
}

int main(){

	string str = " 01010 10101 11100 11111 00011";
	//01101 00011 10100

	int maxum;
	maxum = fu(str);
	cout << maxum << endl;
	while(1);
	return 0;
}

后缀式计算

#include<iostream>
#include<stack>
#include<vector>
#include<string>
#include<sstream>
#include<map>
using namespace std;
#

class MyCal
{
public:
	MyCal();
	~MyCal();
	//定义一个函数接口,安全性考虑
	int calmain(string str){
		//int INTresult;
		int re = calRpnMain(str);
		return re;
	}


private:
	int temp_num;
	int temp_op;
	stack<int> num_stack;
	stack<char> op_stack;
	//map<char, int> queryPriority = map<char, int>{{ '*', INT_MIN + 1 }, { '+', INT_MIN + 2 }, {'-',INT_MIN + 2}};
	int calRpnMain(string str)
	{
		for (auto it : str){
			//判断当前字符是数字,是数字就进入数字栈
			if (it >= '0' && it <= '9')  {
				temp_num = it - '0';
				num_stack.push(temp_num);
			}
			else if (it >= 'A' && it <= 'F'){
				temp_num = it - 'A'+10;
				num_stack.push(temp_num);
			}
			//处理运算符
			else{
	
				if (!num_stack.empty()){
					int num1 = num_stack.top();
					//cout <<"num1 = " <<num1 <<endl;
					num_stack.pop();
					int num2 = num_stack.top();
					num_stack.pop();
					int result1;
					result1 = cal(num1, num2, it);
					//cout << "result1 = " << result1 << endl;
					num_stack.push(result1);

				}
			}
		}
		return num_stack.top();

	}
	int cal(int op1, int op2, char it){
		switch(it)
		{
		case '*':
		{
			int result2;
			result2 = op1 * op2;
			return result2;

		}	
		case '-':
		{
			int result2;
			result2 = op2 - op1;
			return result2;
		}
			
		case '+':
		{
			int result2;
			result2 = op1 + op2;
			return result2;
		}
			
		default:
			break;
		}

	}

};

MyCal::MyCal()
{
}

MyCal::~MyCal()
{
}

int main(){
	MyCal opcal;
	string str ;
	while (getline(cin, str))
	{
		cout << opcal.calmain(str)<<endl;
	}
	while (1);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值