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打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。

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';

}



二、题目描述(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”

 

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;

}




 

 

你可能感兴趣的:(华为)