2013华为C&C++机试题

华为的机试地点一般在高校附近的网吧(比如这次是玉泉饭店旁的沸蓝网吧),虽然先安排的机试时间,但一般是过去签个到有空机位便可直接开始做,每个人按登陆时间计时,一小时三道题(第三题算是附加题),电脑不能上网,C和C++的编程环境是VC6.0,可debug。

下面是我昨天机试题。

####一、题目描述(60分): 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:

void stringFilter(const char pInputStr, long lInputLen, char pOutputStr);

【输入】 pInputStr: 输入字符串; lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 输入:“deefd” 输出:“def” 输入:“afafafaf” 输出:“af” 输入:“pppppppp” 输出:“p”

####二、题目描述(40分): 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:

  1. 仅压缩连续重复出现的字符。比如字符串”abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc”.
  2. 压缩字段的格式为”字符重复的次数+字符”。例如:字符串”xxxyyyyyyz”压缩后就成为”3x6yz”

要求实现函数:

void stringZip(const char pInputStr, long lInputLen, char pOutputStr);

【输入】pInputStr: 输入字符串 lInputLen: 输入字符串长度

【输出】pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 输入:“cccddecc” 输出:“3c2de2c” 输入:“adef” 输出:“adef” 输入:“pppppppp” 输出:“8p”

####三、题目描述(50分): 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

  1. 操作数为正整数,不需要考虑计算结果溢出的情况。
  2. 若输入算式格式错误,输出结果为“0”。

要求实现函数:

void arithmetic(const char pInputStr, long lInputLen, char pOutputStr);

【输入】 pInputStr: 输入字符串 lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】 只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 输入:“4 + 7” 输出:“11” 输入:“4 - 7” 输出:“-3” 输入:“9 ++ 7” 输出:“0” 注:格式错误

include <stdio.h>
include <stdlib.h>
include <string.h>
#define MAXCHAR 256

//这道题是直接对字符串指针操作完成,所以不要忘了最后在	pOutputStr后加'\0'
//很简单,哈希记录一下即可,也没有什么边界条件

void stringFilter(const char pInputStr, long lInputLen, char pOutputStr)
{
	if(pInputStr == NULL || pInputStr == '\0' || lInputLen == 0)return;
	bool tag[26] = {false};
	while(pInputStr != '\0')
	{
		int index = pInputStr - 'a';
		if(tag[index] == false)
		{
			pOutputStr++ = pInputStr++;
			tag[index] = true;
		}
		else
			pInputStr++;
	}
	pOutputStr = '\0';
} ---

//这题在上机的时候直接操作字符指针稍不留神就出了点问题,debug下才找到错误,所以这里用数组取值的形式来写
//需要注意的地方:重复字符的个数应该不只是个位数(错写成count + '0'),所以用itoa更方便安全
void stringZip(const char pInputStr, long lInputLen, char pOutputStr)
{
	if(pInputStr == NULL || pInputStr == '\0' || lInputLen == 0)
	return;
	char num[30];
	int count = 0;
	int k = 0;
	for(int i = 0; i < lInputLen; )
	{
		for(int j = i + 1; ; ++j)
		{
			if(pInputStr[j] == pInputStr[i])
				count++;
			else
				break;
		}
		if(count != 0)
		{
			memset(num, 0, sizeof(num));
			itoa(count + 1, num, 10);
			strcat(pOutputStr, num);
			k += strlen(num);
			i += count;
		}
		pOutputStr[k++] = pInputStr[i++];
		count = 0;
	}
}

//这题机试的时候木有考虑全边界条件,给跪,而且C里面好多库函数给忘了
//因为不需要考虑溢出,其实题目已经简化许多了,都是一些比较简单的边界检查
void arithmetic(const char pInputStr, long lInputLen, char pOutputStr)
{
	if(pInputStr == NULL || pInputStr == '\0' || lInputLen == 0)
	return;
	char op1[30], op[30], op2[30];
	char buffer[30];
	const char c = "0";
	int count = 0;
	for(int i = 0; i < lInputLen; ++i)
		if(pInputStr[i] == ' ')
			count++;
		if(count != 2)
		{
			strcat(pOutputStr, c);
			return;
		}
	sscanf(pInputStr, "%s %s %s", op1, op, op2); //完成从字符串中按格式读入数据。C++中用istringstream可以完成
	for(strlen(op) > 1 || (op[0] != '+' && op[0] != '-'))
	{
		strcat(pOutputStr, c);
		return;
	}
	for(int i = 0; i < strlen(op1); ++i)
	{
		if(op1[i] < '0' || op1[i] > '9')
		{
			strcat(pOutputStr, c);
			return;
		}
	}
	for(int i = 0; i < strlen(op2); ++i)
	{
		if(op2[i] < '0' || op2[i] > '9')
		{
			strcat(pOutputStr, c);
			return;
		}
	}
	long long a = atoi(op1);
	long long b = atoi(op2);
	long long result;

	switch(op[0])
	{
		case '+':
			result = a + b;
			itoa(result, buffer, 10); //这里用一个buffer过渡的原因,其实是itoa(Converts an integer value to a null-terminated string using the specified base), buffer里没有字符串终结符
			strcat(pOutputStr, buffer); //strcat的好处便是补上了字符串终结符'\0';还有一点是strcat的第二个参数const char ,因而你不能直接给个字符常量进行传参
			break;
		case '-':
			result = a - b;
			itoa(result, buffer, 10);
			strcat(pOutputStr, buffer);
			break;
		default:
			break;
	}
}

int main()
{
	char pInputStr1[] = {"aaabbbcccdde"};
	char pInputStr2[] = {"aaabbcddde"};
	char pInputStr3[] = {"3 + 4"};
	char pOutputStr1[MAXCHAR] = {0};
	char pOutputStr2[MAXCHAR] = {0};
	char pOutputStr3[MAXCHAR] = {0};

	/ TODO: 调用被测函数 /
	stringFilter(pInputStr1, strlen(pInputStr1), pOutputStr1);
	stringZip(pInputStr2, strlen(pInputStr2), pOutputStr2);
	arithmetic(pInputStr3, strlen(pInputStr3), pOutputStr3);

	/ TODO: 执行完成后可比较是否是你认为正确的值 */
	printf(pOutputStr1); //abcde
	printf(pOutputStr2); //3a3b3c2de
	printf(pOutputStr3); //7
	return 0;
}

总结:基本功很重要很重要,快速地实现一个无bug函数对我来说仍需多练。</u>

crystal /
Published under (CC) BY-NC-SA in categories 面试  tagged with 面试总结