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.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以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数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:期待更新吧!