读书人

二零一四年华为上机题及代码

发布时间: 2013-11-08 17:51:56 作者: rapoo

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


读书人网 >编程

热点推荐