当前位置:文档之家› 华为机试题目

华为机试题目








字符串通配查找
描述: 请用程序实现带有通配符(?与*)的字符串匹配功能。

?代表单个字符,*代表任意个(0或多个)字符

运行时间限制: 无限制
内存限制: 无限制
输入: 带有通配符的模式串和目标串,长度均不超过20。

模式串在前,目标串在后。

输出: 输出第一个匹配位置的下标值(字符串起始开始就匹配上的值为0),若没有匹配的位置则输出-1

样例输入: ?^_^*
abc^_^abc
样例输出: 2
答案提示: 2


/*
* 封装PPP数据包
描述: 计算机通信中会使用多种协议,TCP/IP协议族是最常见的一组,其中有一个链路层协议叫PPP协议,也称点到点协议,比如家庭使用的ADSL拨号链路层使用的就是PPP协议,底层使用是以太网协议,也称PPPOE。PPP协议也规定了自己的组包方式,也就是上层协议的数据,抵达PPP层时,会再次添加包头和包尾,继而传输到更底层的协议。下面介绍下PPP协议打包的基本规则,根据该规则,按照要求读取原始数据,组包成PPP规定的新数据。

PPP数据包格式简介:
-------------------------------------------------------------
|标志 | 地址 | 控制 | 协议 | 信息 | CRC校验 | 标志|
------------------------------------------------------------
1字节 1字节 1字节 2字节 N字节 2字节 1字节

标志:PPP包的开头和结尾,1字节长度,固定为0x7e
地址:1字节,固定为0xff
控制:1字节,固定为0x03
协议:2字节,本题目有3组值:0xc021(LCP) , 0xc023(PAP), 0x8021(IPCP)
信息:字节数不定,为上层协议的数据
CRC校验:2字节,本题目中不进行计算,默认填充为0xffff

由于标志字符的值是0x7e,因此当该字符出现在信息字段中时, PPP需要对它进行转义。
特殊字符 0x7d用作转义字符。当它出现在 PPP数据帧中时,那么紧接着的字符的第6个比特要取其补码,具体实现过程如下:
1) 当遇到字符0x7e时,需连续传送两个字符:0x7d和0x5e,以实现标志字符的转义。
2) 当遇到转义字符0x7d时,需连续传送两个字符:0x7d和0x5d,以实现转义字符的转义。
3) 默认情况下,如果字符的值小于 0x20都要进行转义。例如,遇到字符0x01时需连续传送0x7d和0x21两个字符(这时,第6个比特取补码后变为1) 。



运行时间限制: 无限制
内存限制: 无限制
输入: 读取3组参数

参数1:协议名称,字符串格式,:3种中的一个 LCP/PAP/IPCP
参数2:“信息”长度,单位为字节
参数3:PPP包中的“信息”字段数据,16进制格式,长度为参数2

输出: 满足PPP数据包格式的新数据包,按照16进制格式输出

样例输入: IPCP 2 19 5a
样例输出: 7e ff 03 21 80 7d 39 5

a ff ff 7e
答案提示: PPP数据包长度最长为1500字节参数输入都合法,不考虑非法值自己写main函数以及必要子函数实现数据的读取和输出可能需要的头文件#include #include #include

*
* */







1.子串分离,输入一段字符,将其中的空格转化成逗号,input:ab sdfe werfq output:ab,sefe,werfq,
2.链表的逆置
2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。

说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重;

最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。

要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无

示例
输入:char *input = “Abort!May Be Some Errors In Out System. “
输出:char *output =“aeeeooAEIO “



#include
using namespace std;
void sortVowel (char* input, char* output)
{
char yuyin[10]={'a','e','i','o','u','A','E','I','O','U'};
char *temp1=output;
for(int i=0;i<10;i++)
{
char *temp=input;
while(*temp!=0)
{
if(*temp==yuyin[i])
{
*temp1=yuyin[i];
temp1++;
temp++;
}
else temp++;
}
}
}




题目:
题目描述(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
#include
//过滤函数
void stringFilter(const char *pInputStr, char *pOutputStr)
{


int a[26] = {0};
const char* pstr = pInputStr;
char* pResult = pOutputStr;
while( *pstr != '\0')
{
a[*pstr - 'a']++;
if(a[*pstr - 'a'] > 1)
{
pstr++;
}
else
{
*pResult = *pstr;
pstr++;
pResult++;
}


}
*pResult = '\0';


}
//压缩字符串
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{


const char* pFirst = pInputStr;
const char* pSecond = pInputStr+1;
char* pResult = pOutputStr;
int count = 0;
while(*pSecond != '\0')
{
if(*pSecond == *pFirst)
{
count++;
}
else
{
if(count > 0)
{
*pResult++ = count+1 + '0';
}
*pResult++ = *pFirst;
count = 0;
}
pFirst++;
pSecond++;
}
if(count > 0)
{
*pResult++ = count+1 + '0';
}
*pResult++ = *pFirst;
*pResult = '\0';


}


void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char* pTemp = (char*)malloc(lInputLen);
char* pLeft = pTemp;
const char* pRight = pInputStr;
while(*pInputStr != '\0')
{
if(*pInputStr == '+' || *pInputStr == '-')
{


pRight = pInputStr + 1;
break;
}
else
{
*pTemp++ = *pInputStr++;
}
}
*pTemp = '\0';
if (pRight == pLeft || *pRight == '+' || *pRight == '-')
{
*pOutputStr++='0';
*pOutputStr = '\0';
return;
}
int L = atoi(pLeft);
int R = atoi(pRight);
int result;
switch (*pInputStr)
{
case '+':
result = L + R;
break;
case '-':
result = L - R;
break;
default:
result = 0;
break;
}
itoa(result, pOutputStr, 10);


}


int main()
{
//char a[] = "youyouare";
//char a1[] = "deefd";
//char a2[] = "afafafaf";
//char a3[] = "ppppp";
//char* b = (char*)malloc(100);
//char* b1 = (char*)malloc(100);
//char* b2 = (char*)malloc(100);
//char* b3 = (char*)malloc(100);
//
//stringFilter(a,b);
//stringFilter(a1,b1);
//stringFilter(a2,b2);
//stringFilter(a3,b3);


//char t1[] = "cccddecc";
//char t2[] = "deefd";
//char t3[] = "pppppp";
//char rt1[15], rt2[15], rt3[15];
//stringZip(t1,0,rt1);
//stringZip(t2,0,rt2);
//stringZip(t3,0,rt3);


char s1[] = "4+7";
char s2[] = "4-7";
char s3[] = "9++7";
char st1[15], st2[15], st3[15];
arithmetic(s1, strlen(s1), st1);
arithmetic(s2, strlen(s2), st2);
arithmetic(s3, strlen(s3), st3);




}




西安电子科技大学 2013年10月24日(周四)10:00-13:00 南校区就业中心116














联想G490AT-IFI 联想N480A-IFI(D)



























相关主题
文本预览
相关文档 最新文档