华为的一道编程题

题目:

假设电报中用点(.)表示1,用中划线(-)表示0,点与中划线的序列,能够翻译成一个二进制数(可以看做无符号数)。将此二进制转换为整数后,通过一个映射表,可以将整数映射成一个英文字母。多个点、中划线序列间,用#隔开(多个连续的#号,算作一个#号),表示多个英文字母。
当电报中没有点、中划线,只有#时,电报内容为空字符串。
每个点、中划线序列,可以看做是无符号数。如果有点、中划线序列的二进制值超出如下映射表的范围,则输出”ERROR”。
映射表:
 
请将输入的点、中划线序列集合,转换为英文字母集合。
输入描述:
由点(.)、中划线(-)、#集合构成的原始报文。输出描述:
经过转换后生成的英文字符序列(英文区分大小写)
 
二进制值超出如下映射表的范围,则输出”ERROR”
示例1
输入
复制
--.#.#-.-
输出
复制
GGR

C++代码:

	#include 
	#include 
	#include 

	char NumToInt(unsigned int number)
	{
		char map[] = { 'F', 'G', 'R', 'S', 'T', 'L', 'M', 'N', 'O', 'P', 'Q',\
			'W', 'X', 'Y', 'Z', 'U', 'A', 'G', 'H', 'I', 'J', 'K',\
			'B', 'C', 'D', 'E', 'l', 'm', 'n', 'o', 'p', 'i', 'j', 'k', 'f', 'g', 'h',\
			'a', 'b', 'c', 'd', 'e', 'q', 'r', 'w', 'x', 'y', 'z', 's', 't', 'u', 'v' };

		return map[number];
	}

	bool anylise(std::vector value, char &character)
	{
		if (value.size() == 0)
			return true;

		unsigned int result=0;
		for (unsigned int i = 0; i < value.size(); i++)
		{
			result += value[i] << (2, value.size() - i-1);
		}
		if (result > 52 )
			return false;
		character = NumToInt(result);
		return true;
	}

	void test(const char* str, unsigned int len)
	{
		int count = 0; //num of #
		std::vector num;

		for (unsigned int i = 0; i < len; i++)
		{
			switch (str[i])
			{
			case '.':
				num.push_back(1);
				count = 0;
				break;
			case '-':
				num.push_back(0);
				count = 0;
				break;
			case '#':
				if (count == 0 && num.size() >0)
				{
					char character = ' ';
					bool success = anylise(num, character);
					num.clear();
					if (success)
						std::cout << character;
					else
						std::cout << "ERROR";
					count++;
				}
				break;
			default:
				break;
			}
		}
		char cha = ' ';
		bool success = anylise(num, cha);
		num.clear();
		if (success)
			std::cout << cha;
		else
			std::cout << "ERROR";
	}

	int main(int argc, char** argv)
	{
		std::string s("--.");
		test(s.c_str(), s.length());

		return 0;
	}

 

你可能感兴趣的:(C++)