|
面试题一:农夫有一只羊,这只羊2年后会生一只小羊,5年后羊会死亡,生出来的小羊也是这个规律,2年生一只小羊,5年死亡。
问10年后,这个农夫会有多少羊。
这是一个程序题,如果面到这个题目的时候,如果从数学的角度去考虑这个问题,估计面试官没有这个耐心等我们把这个规律找出来。从程序的角度考虑,这道题就简单多了,只需要记录每只羊的年纪,,他的年纪到了2的倍数就生一个小羊,超过了5年,就杀死他。
// 记录每只羊的编号和年龄
$sheeps = array(
0 => 0,
);
for($i = 1; $i <= 6; $i++) {
// 每年都计算一下羊的个数
$tatolSheeps = count($sheeps);
for($j=0; $j < $tatolSheeps; $j++) {
// 每过一年,所有的羊的年纪大一岁
$sheeps[$j]++;
// 超过5岁,就把这只羊杀掉
if ($sheeps[$j] >= 5) {
unset($sheeps[$j]);
}
else if ($sheeps[$j] % 2 == 0) {
// 生一只小羊,岁数为0
$sheeps[] = 0;
}
}
}
echo count($sheeps);
以上的解法,当年数不超过5年的时候没有问题,一旦超过5年,即有羊死亡,就会出现问题。 // 第五年的数组
Array
(
[1] => 3
[2] => 1
[3] => 1
)
// 第六年的数组
Array
(
[1] => 4
[2] => 2
[3] => 1
[0] => 1
[4] => 0
[5] => 0
)
而正常来说,第三只羊的岁数应该是2岁,不应该有[0] => 1这样奇怪的羊,应该有一个羊为[6]=>0第六年的数组应该是:
Array
(
[1] => 4
[2] => 2
[3] => 2
[4] => 0
[5] => 0
[6] => 0
)
问题就出现在,当我删除一个羊的时候。比如,第五年,我一共有3只羊,我删除了第一只羊,因为他的岁数已经是5岁了,在第六年做for循环的时候,当$j=0时,已经找不到第一只羊了,因为这个羊已经被我删除了,这里就是为什么出现了[0] => 1这样奇怪的羊。同时,$j只能取到2,也就是说,我的第三只羊,即下标为3的羊取不到了。 这个可以使用foreach来避免这样的问题。
$sheeps = array(
0 => 0,
);
for ($i = 1; $i <= 5; $i++) {
foreach ($sheeps as $key => $sheep) {
$sheeps[$key]++;
if ($sheeps[$key] >= 5) {
unset($sheeps[$key]);
}
else if ($sheeps[$key] % 2 == 0) {
$sheeps[] = 0;
}
}
}
面试题二:冒泡排序
$arr = array(1,3,56,22,33,12,19,29,90,12);
$count = count($arr);
for ($i=0; $i < $count; $i++) {
for ($j=0; $j < $count-$i-1; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$k = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $k;
}
}
}
|
|
|