PHP面试题目:一周计算
PHP面试题目:一周计算
不久前,有人给了我一个面试的任务。我是写一个函数,推导出的标准一周工作七天的任何日历(甚至一个虚构的),提供我知道闰年发生频率,如果有的话,一年有多少个月,每个月有多少天。接下来就看看具体的情况,更多内容请关注应届毕业生网!
这是一个相当常见的介绍性job-interview任务,在本文中我将解决和解释其背后的数学。我没有电影那么随意扔简化和修正我——我相信我是一个不必要的复杂的。本文将呈现接近问题的两个方面——一个可以让你精神这么做动态(给你的朋友留下深刻印象,我猜?),和一个电脑更友好(更少的代码行,更多)。
日历的定义我得到了如下:
每年有13个月 甚至每一个月21天,每个奇怪的月有22 13月缺少一天每个闰年 闰年是任何被5整除 每周7天:星期天,星期一,星期二,星期三,星期四,星期五,星期六
任务如下:
考虑到1900年的第一天是星期一,编写一个函数,将打印给定日期的星期。的例子中,输入{:17日月:11日:2013 }输出“星期六”。
在本文的其余部分,我将使用以下日期格式:dd.mm。yyyy,因为它是什么是有意义的.
准备
在开始任何聪明的风险之前,有一个适当的环境设置是很重要的,以避免浪费时间在那些可能是提前准备。我总是建议你进入编码面试任务跃跃欲试的开发环境,可以测试您的代码在片刻的注意。
创建一个新文件夹包含两个子文件夹:classes,public。是的,这是一个一次性的任务,它可以解决一个简单的程序功能,但我喜欢彻底。你就会明白为什么。
在classes子文件夹,创建一个空的PHP类CalendarCalc.php。在public子文件夹,创建一个文件index.php用下面的内容:
如果你可以在浏览器中打开这个显示“Hello”,您已经准备好开始。
CalendarCalc初始化
使事情更容易验证和想象,我创建了一个演示方法从1.1.1900打印出整个日历。22.13.2013。这将使我们能够轻松地检查我们的计算功能。不过,首先初始化类一样:
iNumDays = count($this->aDays);
$this->iStartDayIndex = array_search('Monday', $this->aDays);
$this->aInput = array('d' => $day, 'm' => $month, 'y' => $year);
}
public function demo() {
}
}
让我们解释受保护的属性。
$aDays是一个数组。定义它确保每个星期有数字索引分配——至关重要的在确定星期后的一天。我们缓存它的长度$iNumDays财产。这让我们扩展数组在以后的日子里,如果我们选择——另一个任务可能会问同样的计算,但提到本周可能已经或多或少地超过7天。
$iStartDayIndex是周一的索引(在本例中),因为一开始天周一(1.1.1900)被定义为在任务描述。当我们开始一天的索引,我们可以用它与计算抵消得到真正的星期。你会明白我的意思。
$aInput是一个数组来保存输入值。当我们实例化CalendarCalc,我们通过的日期值我们想知道本周的日子。这个属性存储这些值,可供我们每想出calc方法,从而确保我们不需要它们,或者更糟的是,重复它们在另一个函数调用。的逻辑$aInput,$iStartDayIndex和$iNumDays是在__construct方法。
其他属性都是不言而喻的。
现在,填充demo()方法用下面的内容:
public function demo() {
$demoYear = $this->startYear;
$totalDays = 0;
while ($demoYear < 2014) {
echo "$demoYear";
$demoMonth = 1;
while ($demoMonth < 14) {
echo "";
echo "";
$dayCount = ($demoMonth % 2 == 1) ? 22 : 21;
$dayCount = ($demoMonth == 13 && $demoYear % 5 == 0) ? 21 : $dayCount;
$demoDay = 1;
echo "";
while ($demoDay <= $dayCount) {
$index = ++$totalDays % 7;
if ($demoDay == 1) {
for ($i = 0; $i < $index-1; $i++) {
echo "";
}
if ($index == 0 || $index == 7) {
$i = 6;
while ($i--) {
echo "";
}
}
}
echo "";
if ($index == 0) {
echo "";
}
$demoDay++;
}
echo "";
$demoMonth++;
}
echo "
Month $demoMonth
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
 
 
$demoDay
";
$demoYear++;
}
}
别烦试图理解这种方法——它是完全不重要。这只是帮助我们验证工作,并根据第二个解决方案实际上是部分我们将在本文中呈现。
改变的内容索引。php文件:
demo();
…并在浏览器中打开它。您应该看到一个日历输出与一下图:
我们现在有一种检查结果17.11.2013真理(注意日期。确实是周六)。
精神的方式
心理的方法计算其实很简单。首先,我们需要的数量闰年日期之间的基地,和给定日期。1900是被5整除,本身就是一个闰年。跳跃的数量因此年之间的差异日期输入日期和基地,除以5,四舍五入(只有充分运行年统计,自然),1900年加一。创建一个新的方法CalendarCalc被称为calcFuture并给它这个内容:
$iLeaps = floor(($this->aInput['y'] - $this->startYear) / $this->leapInterval + 1);
我们甚至还被告知,每个月有21天,和每一个奇怪的月有22:
1 = > 22
2 = > 21
3 = > 22
4 = > 21
5 = > 22
6 = > 21
7 = > 22
8 = > 21
9 = > 22
10 = > 21
11 = > 22
12 = > 21
13 = > 22(或21日在闰年)
总天数在一年,因此,280年,或者279年在闰年。如果我们的模7 280%,0,因为280年是被7整除。在闰年,模是6。
php笔试题库这意味着每年的日历在同一天开始,除了闰年,当它开始那天,在前一年的第一天。因此,如果1.1.1900。周一:
1.1.1901。是星期一
1.1.1902。是星期天
1.1.1903。是星期天
1.1.1904。是星期天
1.1.1905。是星期六
1.1.1906。是星期六
等…
根据这一点,我们可以计算的数量一天行动,直到我们的输入。看到我们知道我们有23跳跃,直到输入日期(2013),我们搬回一天23倍。23%的模7是2,这意味着我们总算圆满3次,然后两天(这是抵消)——1.1.2013。是星期六。检查演示日历,看看自己。
让我们先来了解代码。“飞跃”线以上,后添加以下:
$iOffsetFromCurrent = $iLeaps % $this->iNumDays;
$iNewIndex = $this->iStartDayIndex - $iOffsetFromCurrent;
if ($iNewIndex < 0) {
$iFirstDayInputYearIndex = $this->iStartDayIndex + $this->iNumDays - $iOffsetFromCurrent;
} else {
$iFirstDayInputYearIndex = $iNewIndex;
}
首先,我们计算偏移量。然后,我们计算日子的新索引数组,它取决于是否新指数是积极的。这给了我们一周的日子我们输入年开始。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。