찾다
백엔드 개발PHP 튜토리얼面试题 - PHP算法逻辑:如何计算年龄?

题目:

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

计算:

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

            }
        }
    }

    return $posible;
}

输出:

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

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

回复内容:

题目:

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

计算:

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

            }
        }
    }

    return $posible;
}

输出:

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

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

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

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

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

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

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

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 代码

<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>
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

五个常见的Go语言面试题及解答五个常见的Go语言面试题及解答Jun 01, 2023 pm 08:10 PM

作为近年来备受热捧的一门编程语言,Go语言已经成为众多公司与企业的面试热点。对于Go语言初学者而言,在面试过程中遇到相关问题时,如何回答是一个值得探讨的问题。下面列举五个常见的Go语言面试题及解答,供初学者参考。请介绍一下Go语言的垃圾回收机制是如何工作的?Go语言的垃圾回收机制基于标记-清除算法和三色标记算法。当Go程序中的内存空间不够用时,Go垃圾回收器

2023年前端React面试题大汇总(收藏)2023年前端React面试题大汇总(收藏)Aug 04, 2020 pm 05:33 PM

php中文网作为知名编程学习网站,为您整理了一些React面试题,帮助前端开发人员准备和清除React面试障碍。

2023年精选Web前端面试题大全及答案(收藏)2023年精选Web前端面试题大全及答案(收藏)Apr 08, 2021 am 10:11 AM

本篇文章给大家总结一些值得收藏的精选Web前端面试题(附答案)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

50个你必须掌握的Angular面试题(收藏)50个你必须掌握的Angular面试题(收藏)Jul 23, 2021 am 10:12 AM

本篇文章给大家分享50个必须掌握的Angular面试题,会从初学者-中级-高级三个部分来解析这50个面试题,带大家吃透它们!

php怎么将url的参数转化成数组php怎么将url的参数转化成数组Apr 21, 2022 pm 08:50 PM

转化方法:1、使用“mb_substr($url,stripos($url,"?")+1)”获取url的参数部分;2、使用“parse_str("参数部分",$arr)”将参数解析到变量中,并传入指定数组中,变量名转为键名,变量值转为键值。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.