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=1。C++运算符优先级表见http://blog.youkuaiyun.com/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以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数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:期待更新吧!