现在的位置: 首页 > 综合 > 正文

2014年笔试题1

2014年03月11日 ⁄ 综合 ⁄ 共 4370字 ⁄ 字号 评论关闭

No1.微软2014年校招笔试-----运算符优先级

int i=0;
i+=i>0?i--:i++;
printf("%d\n",i);

结果是?1

分析:++--〉三目运算符〉+=,于是可以拆分成以下代码:

i++;i--;i>0?0:1(执行完这一步i=0);i+=1;最后得到i=1C++运算符优先级表见http://blog.csdn.net/nicky_zs/article/details/4053146

No2.迅雷2014-----多态

class parent
{
public:
	virtual void output();
};
void parent::output()
{
	printf("parent!");
}

class son : public parent
{
public:
	virtual void output();
};
void son::output()
{
	printf("son!");
}

int main(){
son s;
memset(&s , 0 , sizeof(s));
 parent& p = s;
 p.output();
}

结果:程序出错

分析:0x0000 0000是不能被访问的,memset强制使p指向了0x0000 0000发生了错误,把memset(&s , 0 , sizeof(s))去掉,输出:son!这是由于使用虚函数,实现了多态。

No3.美团网-----链表翻转

给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现

思路:首先实现一个链表p1指针到p2的逆转void trans(node *p1,node *p2),然后以步长k遍历翻转

No3.华为机考

①通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 
输入:“deefd”        输出:“def
输入:“afafafaf”     输出:“af
输入:“pppppppp”     输出:“p

//字符过滤
#include<iostream>
using namespace std;
long stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
int main()
{
char str[]="abacacde";
int size=sizeof(str)/sizeof(char);
char *pstr=new char[size];
long str_len=stringFilter(str,size-1,pstr);
*(pstr+str_len)='\0';
cout<<pstr<<endl;
delete []pstr;
return 0;
}


long stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){
long lOutputLen=0;
for(int i=0;i<lInputLen;i++)
{int flag=0;
 for(int j=0;j<lOutputLen;j++)
{ if(lOutputLen==0) {*pOutputStr=*pInputStr;lOutputLen++;}
 else if(*(pInputStr+i)==*(pOutputStr+j))
       flag=1;
}
if(flag==0) {*(pOutputStr+lOutputLen)=*(pInputStr+i);lOutputLen++;}
}
return lOutputLen;
}

②通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"
压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

//字符压缩
#include<iostream>

using namespace std;
long stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
int main()
{
char str[]="aacddddeexxyyokkk";
int size=sizeof(str)/sizeof(char);
char *pstr=new char[size];
long pstr_size=stringZip(str,size-1,pstr);
*(pstr+pstr_size)='\0';
cout<<pstr<<endl;
delete []pstr;
return 0;
}
long stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){
long lOutputLen=0;int i=0;
while(i<lInputLen){
int j=0;
while(*(pInputStr+i+j)==*(pInputStr+i)) ++j;
 if(j>1){*(pOutputStr+lOutputLen)='0'+j;
        *(pOutputStr+lOutputLen+1)=*(pInputStr+i);
		lOutputLen+=2;
		i+=j;
		}
 else {
       *(pOutputStr+lOutputLen)=*(pInputStr+i);
	   lOutputLen++;
	   i++;
	   }
	   }
	   return lOutputLen;
}

③通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:
操作数为正整数,不需要考虑计算结果溢出的情况;
若输入算式格式错误,输出结果为“0”。

要求实现函数: 
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

//数字加减法
#include<iostream>

using namespace std;
long arithmatic(const char *pInputStr, long lInputLen, char *pOutputStr);
int main()
{
char str[]="35 - 49";
int size=sizeof(str)/sizeof(char);
char *pstr=new char[size];
long pstr_size=arithmatic(str,size-1,pstr);
if(pstr_size>0)
{*(pstr+pstr_size)='\0';
cout<<pstr<<endl;}
else cout<<"error!"<<endl;
delete []pstr;
return 0;
}
long arithmatic(const char *pInputStr, long lInputLen, char *pOutputStr){
long lOutputLen=0;int i=0,num1=0,num2=0,flag=0;char op;//lOutputLen记录输出字符串长度;num1,num2记录操作数,;flag表示第一个操作数读取完成标志;op表示操作符
while(i<lInputLen){//记录操作数,操作符
   while((*(pInputStr+i))>='0'&&(*(pInputStr+i))<='9'){
      if(flag==0) num1=num1*10+*(pInputStr+i)-'0';
	  else num2=num2*10+*(pInputStr+i)-'0';
	  i++;
	}
   flag=1;
   if(i<lInputLen&&*(pInputStr+i)==' '&&(*(pInputStr+i+1)=='+'||*(pInputStr+i+1)=='-')&&*(pInputStr+i+2)==' ')
   {op=*(pInputStr+i+1);i+=3;}
   else if(i>=lInputLen) break;
        else return -1;
}
switch(op){
case '+':num1+=num2;break;
case '-':num1-=num2;break;
default:return -1;break;
}
//把结果写入到输出字符串
if(num1<0){*(pOutputStr)='-';lOutputLen++;num1=-num1;}
while(num1>0){int num=num1;int len=1;while(num>10){num/=10;len*=10;}
if(num1>10)
	*(pOutputStr+lOutputLen)=num+'0';
else
    *(pOutputStr+lOutputLen)=num1+'0';
lOutputLen++;
num1-=(int)(*(pOutputStr+lOutputLen-1)-'0')*len;}
return lOutputLen;
}

ps:期待更新吧!

抱歉!评论已关闭.