2014年华为上机题及代码
2013-09-17 16:01
393 查看
http://blog.csdn.net/han_jiang_xue/article/details/11751041
http://blog.csdn.net/dalianmaoblog/article/details/11477997
题目来源于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打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
[cpp] view
plaincopyprint?
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”
[cpp] view
plaincopyprint?
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” 注:格式错误
[cpp] view
plaincopyprint?
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;
}
整个源码:
[cpp] view
plaincopyprint?
//============================================================================
// 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;
}
http://blog.csdn.net/dalianmaoblog/article/details/11477997
题目来源于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打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
[cpp] view
plaincopyprint?
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”
[cpp] view
plaincopyprint?
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” 注:格式错误
[cpp] view
plaincopyprint?
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;
}
整个源码:
[cpp] view
plaincopyprint?
//============================================================================
// 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;
}
相关文章推荐
- 2014年华为上机题及代码
- 2014年华为上机题及代码
- 2014年华为上机题及代码
- 2014年华为上机题一
- 2014年华为校招成渝地区上机试题
- 2014年华为校招机试题和多种代码实现(多个数的最大公约数,相同子串,单词计数)
- 2014年华为上机题目
- 华为上机笔试题目和代码—————语言识别问题
- 2012届华为校园招聘上机考试题目(9月6日下午1点场)第二题及代码
- 2014年华为上机机试c语言题目和答案
- 2014年实习生招聘之华为实习生招聘笔试题(上机完成)—2014/04/02
- 2012届华为校园招聘上机考试题目及参考代码
- 【华为上机】 实现一个简易的银行排号叫号系统(代码欠妥,求修改)
- 华为最新上机题(自己C实现代码)
- 华为上机笔试原题+代码---------股票投资问题
- 华为2016校园招聘上机笔试题:最高分是多少 [python]
- 华为上机测试题(地铁换乘-java)
- 完善一段代码(华为的面试题)
- 华为上机测试题(大数相乘-java)
- 【华为网络排错】ensp 错误代码:40,详细:启动失败