欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-03-21 12:57:06
...
题目:
经理有三个女儿,年龄相加为13。
三个女儿的年龄相乘为经理的年龄,经理的一个手下知道 经理的年龄,但是不知道其三个女儿的年龄。
经理告诉手下有一个女儿头发是黑色的,手下立即知道了三个女儿的年龄。
请问三个女儿的年龄分别是多少?为什么?

计算:


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; }

输出:

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)
**/

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

回复内容:

题目:

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

计算:


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; }

输出:

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)
**/

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

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

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

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

 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";
}
?>

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

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]

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

python 代码

#!/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
相关标签: 面试题 php