05.16 鹅厂面试题,计算两个日期的差

在鹅厂,面试总是必不可少的。

在面试的时候,我常常用下面的方法考查代码和算法的能力。

发送面试通知时,会通知面试者会需要在白纸上手写或者笔记本上不借助IDE编写代码。当对面试者能力一无所知的时候,我最常问的第一个问题是:如何计算两个日期(年月日)之间相差多少天,需要在纸上或者文本编辑器上编写代码。允许面试者使用任何他最擅长的语言。

这个问题问完,有一些想半天还没动笔的,我会把问题简化为如何计算同一年两个日期(月日)之间相差多少天。减分。

有些人会问年的范围。加分。并限定从1970年开始。

有些会问结果是否存在负数。加分。

然后开始写函数声明,函数声明都写不出来的,直接pass。有些会用个结构体表示日期,有些直接在函数声明中使用整数分别表示年月日,都一样。

写实现的时候就五花八门了。

不能写出使用数组表示每月天数的,减分。

能把相差多少天首先抽象成计算某一天(比如1970.1.1)开始的天数,然后两个数字相减。大加分。

有些没有使用上面的方法,而是使用天数直接相减。只要能正确实现,大加分。

能把闰年函数抽象出来的,加分。我不要求写出闰年函数实现,只要能抽象,我会告诉面试者不需要写这个函数实现。

实现写完,看函数的实现,如果整体逻辑混乱的(基本都是面试者尝试直接通过日期加减获得间隔的天数),大减分。

如果整体逻辑清楚,但是有小问题的(例如月份下标出错,有泄漏的),小减分。

另外,整个面试过程中,如果碰到不清晰的,能主动及时沟通的,加分。

然后根据这个题目的答题情况,选择后面的题目。

function isLeapYear(year)

{

return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

}

function getMonthDays(year, month)

{

if (in_array(month, [1, 3, 5, 7, 8, 10, 12]))

{

return 31;

}

elseif(in_array(4, 6, 9, 11))

{

return 30;

}

elseif(isLeapYear(year))

{

return 29;

} else {

return 28;

}

}

function minusStandardDate(year, month, day)

{

retDays = 0;

for (y = 1970; y < year; y++)

{

retDays += isLeapYear(y) ? 366 : 365;

}

for (m = 1; m < month; m++)

{

retDays += getMonthDays(year, month);

}

retDays += day;

return retDays;

}

function getDaysOfTwoDate(y1, m1, d1, y2, m2, d2)

{

days1 = minusStandardDate(y1, m1, d1);

days2 = minusStandardDate(y2, m2, d2);

return abs(days1 - days2);

}


分享到:


相關文章: