Heim > Backend-Entwicklung > PHP-Tutorial > 面试题 - PHP算法逻辑:如何计算年龄?

面试题 - PHP算法逻辑:如何计算年龄?

WBOY
Freigeben: 2016-06-06 20:28:41
Original
1621 Leute haben es durchsucht

题目:

<code>经理有三个女儿,年龄相加为13。
三个女儿的年龄相乘为经理的年龄,经理的一个手下知道 经理的年龄,但是不知道其三个女儿的年龄。
经理告诉手下有一个女儿头发是黑色的,手下立即知道了三个女儿的年龄。
请问三个女儿的年龄分别是多少?为什么?
</code>
Nach dem Login kopieren
Nach dem Login kopieren

计算:

<code class="php"><br>function getAge($sum)
{
    $ageLimit = 121; // 最大年龄121岁
    $ageFrist = 18; //假设最小生育年龄 18岁
    $posible = [];
    for ($c1 = 1; $c1 = $ageFrist) {
                    $arr = [$c1, $c2, $c3];
                    asort($arr);
                    $age = implode('-', $arr);
                    if (!in_array($age, $posible)) {
                        $posible[] = $age;
                    }
                }

            }
        }
    }

    return $posible;
}

</code>
Nach dem Login kopieren
Nach dem Login kopieren

输出:

<code>var_dump(getAge(13));
/**
array (size=12)
  0 => string '1-3-9' (length=5)
  1 => string '1-4-8' (length=5)
  2 => string '1-5-7' (length=5)
  3 => string '1-6-6' (length=5)
  4 => string '2-2-9' (length=5)
  5 => string '2-3-8' (length=5)
  6 => string '2-4-7' (length=5)
  7 => string '2-5-6' (length=5)
  8 => string '3-3-7' (length=5)
  9 => string '3-4-6' (length=5)
  10 => string '3-5-5' (length=5)
  11 => string '4-4-5' (length=5)
**/
</code>
Nach dem Login kopieren
Nach dem Login kopieren

以上输出答案错误。如何解答本题?

回复内容:

题目:

<code>经理有三个女儿,年龄相加为13。
三个女儿的年龄相乘为经理的年龄,经理的一个手下知道 经理的年龄,但是不知道其三个女儿的年龄。
经理告诉手下有一个女儿头发是黑色的,手下立即知道了三个女儿的年龄。
请问三个女儿的年龄分别是多少?为什么?
</code>
Nach dem Login kopieren
Nach dem Login kopieren

计算:

<code class="php"><br>function getAge($sum)
{
    $ageLimit = 121; // 最大年龄121岁
    $ageFrist = 18; //假设最小生育年龄 18岁
    $posible = [];
    for ($c1 = 1; $c1 = $ageFrist) {
                    $arr = [$c1, $c2, $c3];
                    asort($arr);
                    $age = implode('-', $arr);
                    if (!in_array($age, $posible)) {
                        $posible[] = $age;
                    }
                }

            }
        }
    }

    return $posible;
}

</code>
Nach dem Login kopieren
Nach dem Login kopieren

输出:

<code>var_dump(getAge(13));
/**
array (size=12)
  0 => string '1-3-9' (length=5)
  1 => string '1-4-8' (length=5)
  2 => string '1-5-7' (length=5)
  3 => string '1-6-6' (length=5)
  4 => string '2-2-9' (length=5)
  5 => string '2-3-8' (length=5)
  6 => string '2-4-7' (length=5)
  7 => string '2-5-6' (length=5)
  8 => string '3-3-7' (length=5)
  9 => string '3-4-6' (length=5)
  10 => string '3-5-5' (length=5)
  11 => string '4-4-5' (length=5)
**/
</code>
Nach dem Login kopieren
Nach dem Login kopieren

以上输出答案错误。如何解答本题?

做这种题我向来不行, 但是 太明显了, 你漏了几个条件:

  1. 经理的一个手下知道 经理的年龄,但是不知道其三个女儿的年龄。经理告诉手下有一个女儿头发是黑色的,手下立即知道了三个女儿的年龄。 -> 说明 针对 经理的年龄(三女儿年龄乘积), 女儿的年龄有多种选择.

  2. 经理告诉手下有一个女儿头发是黑色的 -> 应该是 "经理告诉手下只有一个女儿头发是黑色的", 说明 其他两个是小小孩, 头发不黑? (逻辑对否? 网上看到的...)

<code class="php"><?php // 用一个数组来保存可能性
$list = array();

// 列出所有可能性,年龄按从小到大试
for ($i = 1; $i < 13; $i++) {
    $rest = 13 - $i;
    for ($j = $i; $j <= $rest / 2; $j++) {
        $k = $rest - $j;
        $product = $i * $j * $k;
        array_push($list, array($i, $j, $k, $product));
    }
}

// 按经理年龄排序
usort($list, function($a, $b) {
    return $a[3] - $b[3];
});

// 先看看所有可能性
foreach ($list as list($i, $j, $k, $p)) {
    echo "$i, $j, $k = $p\n";
}

// 按年龄排除不可能的
$map = array();
foreach ($list as $t) {
    if ($t[0] + $t[1] + $t[2] + 14 < $t[3]) {
        $key = "$t[3]";
        if (array_key_exists($key, $map)) {
            array_push($map[$key], $t);
        } else {
            $map[$key] = array($t);
        }
    }
}

// 找出不唯一的(因为唯一就不需要黑头发条件)
$map = array_filter($map, function($v, $k) {
    return count($v) > 1;
}, 1);

// 二维转一维
$list = array();
foreach ($map as $k => $v) {
    $list = array_merge($list, $v);
}

// 找出年龄中只有一个大于2岁的(黑头发)
// 关于多少岁头发变黑,只有找度娘了
$list = array_filter($list, function($t) {
    $temp = array_filter($t, function($v) {
        return $v > 2;
    });
    return count($temp) == 2;
});

// 输出结果
if (count($list) == 1) {
    echo "found " . json_encode($list[0]);
} else {
    echo "not found";
}
?></code>
Nach dem Login kopieren

所有输出(最后一行是结果)

<code class="markdown">1, 1, 11 = 11
1, 2, 10 = 20
1, 3, 9 = 27
1, 4, 8 = 32
1, 5, 7 = 35
2, 2, 9 = 36
1, 6, 6 = 36
2, 3, 8 = 48
2, 4, 7 = 56
2, 5, 6 = 60
3, 3, 7 = 63
3, 4, 6 = 72
3, 5, 5 = 75
4, 4, 5 = 80
found [2,2,9,36]</code>
Nach dem Login kopieren

我的二杆子 PHP 写得太恼火了,还是写 JS 顺手,哈哈!

python 代码

<code>#!/usr/bin/python
# -*- coding:utf-8 -*-

if __name__ == '__main__':
    s1 = [tuple(sorted([x, y, z])) for x in range(1,13) for y in range(1, 13) for z in range(1, 13) if x + y + z == 13 and 50 > x * y * z > 18]
    s2 = set(s1)
    result = [i for i in s2 if 35 > i[0] * i[1] * i[2] - max(i) > 18]
    print result</code>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage