今年的三月二十八号,我有幸参加了百田公司在中南大学的宣讲会,并参加了笔试。虽然结果不是很令人满意,但通过这次面试提醒了我——程序高手必须重视算法,数据结构,操作系统的学习。这重拾了我对于算法的热情,故为避免遗忘特将题目记录如下。
1.给出一个日期,计算其是该年的第几天
int SumDay(int year, int month, int day) { int bMonth, sumDay; bool mYear = year%4; int i = mYear*1; bMonth = month/2; switch( month ) { case 1: case 2: sumDay = 31 * bMonth + day ; //一二月另行计算; break; default: sumDay = bMonth * 31 + (bMonth -1)* 30 + (month%2) * 30 - 1 - mYear*1 + day; break; } return sumDay; }
2.给定一个算式计算其值:如:输入“2 3 4 * +” 计算如下:(3 * 4)+2
这个记不清楚了,大意是如此的。
int main(int argc, char *argv[]) { char str[] = "243+*"; int num[4]; int top = 0 ; int lNum,rNum,result; for(int i=0;str[i]!='\0';i++) { int j=str[i] - '0'; if(str[i] >'0'&&str[i]<='9') { num[top]=str[i]-'0'; top++; } else { lNum = num[top-2]; rNum = num[top-1] ; switch(str[i]) { case '+': result = lNum + rNum; break; case '-': result = lNum - rNum; break; case '*': result = lNum * rNum; break; case '/': result = lNum / rNum; break; } top--; num[top-1]=result; } } cout<<num[top-1]<<endl; }
3.棋牌规则如下,三个相同或者连续三个成为胡,两个相同称为门,四个相同称为坎,胡牌时只能是多个胡和一个门,问如果给定牌,计算其能胡牌的牌:如:
给定“2 3 4 5 6 9 9” 能胡的牌是:1 4 7
这里的胡和坎以及门是我自己根据记忆命名的,但大意是如此,个人认为这个是三个算法题目里面最难的。
#include<iostream> using namespace std; bool IsCanHu(int type[],int i); bool IsSeries(int type[],int length); int * CopeArry(int source[], int length); int main(int argc, char *argv[]) { int Puk[10]={2,3,4,4,5,6,8,9,9,9}; int typePuk[14]={0}; int hu[13]={0}; int top=0; int i=0; for(i=0;i<10;i++) { typePuk[Puk[i]]++; } for(i=1;i<=13;i++) { if(typePuk[i]<4) { int *temp=CopeArry(typePuk,14); if(IsCanHu(temp,i)) { hu[top++]=i; }; } } for(int j=0;hu[j];j++) { cout<<hu[j]<<" "; } cout<<endl; return 0; } int * CopeArry(int source[], int length) { int * dest = new int [length]; for(int i=0;i<length;i++) { dest[i]=source[i]; } return dest; } bool IsCanHu(int * typePuk,int num) { bool isCanHu=false; typePuk[num]++; for(int i=1;i<=13&&!isCanHu;i++) { if(typePuk[i]>=2) { typePuk[i]-=2; int *temp=CopeArry(typePuk,14); isCanHu = IsSeries(temp,13); if(!isCanHu) { typePuk[i]+=2; } } } return isCanHu; } bool IsSeries(int * typePuk, int length) { int i=0,k=1,j=1; bool isSeries=true; do { i=0; j=0; while(!(typePuk[++i]>0)&&i<length); k=i; if(k<length-2) { while(j<3) { if(typePuk[k+j]>=1) { typePuk[k+j]-=1; } else { isSeries=false; } j++; } } }while(k<length-2); return isSeries; }
上面的这些算法是我在考完之后不甘心自己的失败写的,通过编译对于{2,4,5,6,8,9,9}和{2,3,4,4,5,6,8,9,9,9}是正确的,其他的数据没有测试,另外由于很久没写C++程序了,代码的简洁度就不是很好。