2014年华为上机题及代码
题目来源于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打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
//============================================================================// 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;}