Найдите год с наибольшим количеством людей, живущих в PHP - PullRequest
0 голосов
/ 05 декабря 2018

Учитывая список людей с указанием их рождения и конца года (все между 1900 и 2017 годами), найдите год с наибольшим числом живущих людей.

<?php
class Person {
    function __construct($birth, $death) {
    $this->birthYear = $birth;
    $this->deathYear = $death;
  }
};

$people = [
  new Person(1925, 1972),//47
  new Person(1901, 1960),//59
  new Person(1942, 1999),//57
  new Person(1960, 2010),//50
  new Person(1931, 2017),//86
  new Person(1961, 1995),//34
  new Person(1919, 1982),//63
];
$birth = array_column($people,"birthYear");
$death = array_column($people,"deathYear");
$START_YEAR = 1900;
$END_YEAR = 2017+1;
$people_alive = [];
$people = json_decode(json_encode($people),true);

foreach($people as $k=>$v){
    $a = $v['birthYear'] - $START_YEAR;
    $b = $v['deathYear'] - $START_YEAR +1;
    $people_alive[]= $b-$a +1;
}
print_r($people_alive);

Я пытался преобразовать решение из python в PHP, но это не то, что я хочу.Решение от python

Array
(
    [0] => 49
    [1] => 61
    [2] => 59
    [3] => 52
    [4] => 88
    [5] => 36
    [6] => 65
)

Я хочу год, когда большинство людей были живы.Я не понимаю, как будет создаваться эта логика.

1 Ответ

0 голосов
/ 05 декабря 2018

Самым простым решением будет пройти через все годы и посчитать, сколько людей живо в данный год.Затем найдите год с максимальным числом - это будет год с наибольшим количеством людей в живых.Имейте в виду, что это решение не является оптимальным и имеет общую сложность O(n):

<?php
class Person {
    public function __construct($birth, $death) {
        $this->birthYear = $birth;
        $this->deathYear = $death;
    }
};

$people = [
    new Person(1925, 1972),//47
    new Person(1901, 1960),//59
    new Person(1942, 1999),//57
    new Person(1960, 2010),//50
    new Person(1931, 2017),//86
    new Person(1961, 1995),//34
    new Person(1919, 1982),//63
];

$start = 1900;
$end = 2017;

// create list of years in given time frame
$years = array_fill($start, $end - $start + 1, 0);

// iterate through all the people
foreach ($people as $person) {
    for ($i = $person->birthYear; $i <= $person->deathYear; ++$i) {
        $years[$i] += 1;
    }
}

// the maximum number of people alive in one year
$max_count = max($years);
// the year with the most number of people alive
$max_year = array_search($max_count, $years);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...