题目来源于http://blog.csdn.net/hackbuteer1/article/details/11132567。
后面的代码是今天早上才写的,C++好长时间不写了,一些简单的函数都是上网查的用法,如果要我现场写,估计很悬。
华为2014校园招聘的机试题目和2013年的完全一样。
一、题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){ map<char,int> charMap; int k=0; for(int i=0;i<lInputLen;i++){ if(charMap.find(*(pInputStr+i))==charMap.end()){ *(pOutputStr+k++)=*(pInputStr+i); charMap.insert(pair<char,int>(*(pInputStr+i),1)); } } *(pOutputStr+k++)='\n'; }
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){ int k=0; for(int i=0;i<lInputLen;i++){ int num=1; int j=i+1; for(;j<lInputLen;j++){ if(pInputStr[j]==pInputStr[i]){ num++; }else{ break; } } if(num!=1){ char str[100]; sprintf(str,"%d",num); strcpy(pOutputStr+k,str); k = k+strlen(str); } *(pOutputStr+k++)=*(pInputStr+i); i = j-1; } *(pOutputStr+k++)='\n'; }
三、题目描述(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” 注:格式错误
bool isOperater(char* c){ char f[]="+-*/"; if(c==NULL||strlen(c)!=1){ return false; } for(int i=0;i<strlen(f);i++){ if(f[i]==*c) return true; } return false; } bool isNumber(char* c,int& num){ if(c==NULL||strlen(c)<=0){ return false; } for(int i=0;i<strlen(c);i++){ if(c[i]>'9'||c[i]<'0') return false; } num = atoi(c); return true; } struct data{ public: bool isNum; union{ char operater; int number; }u; }; void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr){ stack<data> Stack; const char *d = " "; char s[256]; strcpy(s,pInputStr); char *p; int num; p = strtok(s,d); while(p){ if(isOperater(p)){ //是操作符 if(Stack.size()<1){ strcpy(pOutputStr,"0"); //格式错误 return; }else{ data data1= Stack.top(); if(data1.isNum){ //栈顶元素是数字 data data2; data2.isNum = false; data2.u.operater=*p; Stack.push(data2); }else{//栈顶元素是操作符 strcpy(pOutputStr,"0"); //格式错误 return; } } }else if(isNumber(p,num)){ //是数字 if(Stack.size()<1){ data data1; data1.isNum = true; data1.u.number=num; Stack.push(data1); }else{ data data1= Stack.top(); if(data1.isNum){ //栈顶元素是数字 strcpy(pOutputStr,"0"); //格式错误 return; }else{//栈顶元素是操作符 Stack.pop(); data data2 = Stack.top(); Stack.pop(); if(!data2.isNum){ strcpy(pOutputStr,"0"); //格式错误 return; } int num2 = data2.u.number; int num3 = 0; switch(data1.u.operater){ case '+': num3=num2+num; break; case '-': num3=num2-num; break; case '*': num3=num2*num; break; case '/': num3=num2/num; break; default: strcpy(pOutputStr,"0"); //格式错误 return; } data data3; data3.isNum=true; data3.u.number=num3; Stack.push(data3); } } }else{ strcpy(pOutputStr,"0"); //格式错误 return; } p=strtok(NULL,d); } if(Stack.size()==1){ data d = Stack.top(); if(d.isNum){ sprintf(pOutputStr,"%d",d.u.number); return; } } strcpy(pOutputStr,"0"); //格式错误 return; }
//============================================================================ // Name : huaweijishi.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <map> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <stack> using namespace std; void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){ map<char,int> charMap; int k=0; for(int i=0;i<lInputLen;i++){ if(charMap.find(*(pInputStr+i))==charMap.end()){ *(pOutputStr+k++)=*(pInputStr+i); charMap.insert(pair<char,int>(*(pInputStr+i),1)); } } *(pOutputStr+k++)='\n'; } void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){ int k=0; for(int i=0;i<lInputLen;i++){ int num=1; int j=i+1; for(;j<lInputLen;j++){ if(pInputStr[j]==pInputStr[i]){ num++; }else{ break; } } if(num!=1){ char str[100]; sprintf(str,"%d",num); strcpy(pOutputStr+k,str); k = k+strlen(str); } *(pOutputStr+k++)=*(pInputStr+i); i = j-1; } *(pOutputStr+k++)='\n'; } bool isOperater(char* c){ char f[]="+-*/"; if(c==NULL||strlen(c)!=1){ return false; } for(int i=0;i<strlen(f);i++){ if(f[i]==*c) return true; } return false; } bool isNumber(char* c,int& num){ if(c==NULL||strlen(c)<=0){ return false; } for(int i=0;i<strlen(c);i++){ if(c[i]>'9'||c[i]<'0') return false; } num = atoi(c); return true; } struct data{ public: bool isNum; union{ char operater; int number; }u; }; void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr){ stack<data> Stack; const char *d = " "; char s[256]; strcpy(s,pInputStr); char *p; int num; p = strtok(s,d); while(p){ if(isOperater(p)){ //是操作符 if(Stack.size()<1){ strcpy(pOutputStr,"0"); //格式错误 return; }else{ data data1= Stack.top(); if(data1.isNum){ //栈顶元素是数字 data data2; data2.isNum = false; data2.u.operater=*p; Stack.push(data2); }else{//栈顶元素是操作符 strcpy(pOutputStr,"0"); //格式错误 return; } } }else if(isNumber(p,num)){ //是数字 if(Stack.size()<1){ data data1; data1.isNum = true; data1.u.number=num; Stack.push(data1); }else{ data data1= Stack.top(); if(data1.isNum){ //栈顶元素是数字 strcpy(pOutputStr,"0"); //格式错误 return; }else{//栈顶元素是操作符 Stack.pop(); data data2 = Stack.top(); Stack.pop(); if(!data2.isNum){ strcpy(pOutputStr,"0"); //格式错误 return; } int num2 = data2.u.number; int num3 = 0; switch(data1.u.operater){ case '+': num3=num2+num; break; case '-': num3=num2-num; break; case '*': num3=num2*num; break; case '/': num3=num2/num; break; default: strcpy(pOutputStr,"0"); //格式错误 return; } data data3; data3.isNum=true; data3.u.number=num3; Stack.push(data3); } } }else{ strcpy(pOutputStr,"0"); //格式错误 return; } p=strtok(NULL,d); } if(Stack.size()==1){ data d = Stack.top(); if(d.isNum){ sprintf(pOutputStr,"%d",d.u.number); return; } } strcpy(pOutputStr,"0"); //格式错误 return; } int main() { char r[256]; int a = atoi("a"); char* p="abcddcae"; stringFilter(p,strlen(p),r); cout<<"原字符串:"<<p<<endl; cout<<"转换后的字符串:"<<r<<endl; p = "aaabbbcceffggh"; stringZip(p,strlen(p),r); cout<<"原字符串:"<<p<<endl; cout<<"转换后的字符串:"<<r<<endl; p = "1 + 2"; arithmetic(p,strlen(p),r); cout<<"原字符串:"<<p<<endl; cout<<"转换后的字符串:"<<r<<endl; p = "1a + 2"; arithmetic(p,strlen(p),r); cout<<"原字符串:"<<p<<endl; cout<<"转换后的字符串:"<<r<<endl; p = "1 + 2 * 3"; arithmetic(p,strlen(p),r); cout<<"原字符串:"<<p<<endl; cout<<"转换后的字符串:"<<r<<endl; return 0; }