应聘经验——百田公司面试题记忆

    今年的三月二十八号,我有幸参加了百田公司在中南大学的宣讲会,并参加了笔试。虽然结果不是很令人满意,但通过这次面试提醒了我——程序高手必须重视算法,数据结构,操作系统的学习。这重拾了我对于算法的热情,故为避免遗忘特将题目记录如下。

    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++程序了,代码的简洁度就不是很好。

原文地址:https://www.cnblogs.com/quandeboke/p/2984336.html