YEAHUB_PHP_BACKEND Telegram 380
#ЛитКод
Задача: 721. Accounts Merge

Дан список аккаунтов, в котором каждый элемент accounts[i] - это список строк, где первый элемент accounts[i][0] - это имя, а остальные элементы - это email, представляющие электронную почту аккаунта. Теперь мы хотим объединить эти аккаунты. Два аккаунта определенно принадлежат одному человеку, если у обоих аккаунтов есть какой-то общий email. Обратите внимание, что даже если два аккаунта имеют одинаковое имя, они могут принадлежать разным людям, поскольку у людей могут быть одинаковые имена. Изначально у человека может быть любое количество счетов, но все его счета обязательно должны иметь одинаковое имя. После объединения счетов верните счета в следующем формате: первый элемент каждого счета - имя, а остальные элементы - электронные письма в отсортированном порядке. Сами аккаунты могут быть возвращены в любом порядке.

Пример:
nput: accounts = [["John","[email protected]","[email protected]"],["John","[email protected]","[email protected]"],["Mary","[email protected]"],["John","[email protected]"]]
Output: [["John","[email protected]","[email protected]","[email protected]"],["Mary","[email protected]"],["John","[email protected]"]]


👨‍💻 Алгоритм:

1⃣Создайте граф, в котором узлы представляют email-адреса, а ребра соединяют email-адреса, принадлежащие одному аккаунту.

2⃣Пройдите по графу, чтобы найти все связанные компоненты, которые представляют объединенные аккаунты.

3⃣Для каждой связанной компоненты, соберите email-адреса, отсортируйте их и добавьте имя пользователя в начало списка.

😎 Решение:
function accountsMerge($accounts) {
$emailToName = [];
$graph = [];

foreach ($accounts as $account) {
$name = $account[0];
$firstEmail = $account[1];
foreach (array_slice($account, 1) as $email) {
if (!isset($graph[$firstEmail])) $graph[$firstEmail] = [];
if (!isset($graph[$email])) $graph[$email] = [];
$graph[$firstEmail][] = $email;
$graph[$email][] = $firstEmail;
$emailToName[$email] = $name;
}
}

$seen = [];
$mergedAccounts = [];

foreach ($emailToName as $email => $name) {
if (!isset($seen[$email])) {
$emails = [];
$stack = [$email];
while (!empty($stack)) {
$node = array_pop($stack);
if (!isset($seen[$node])) {
$seen[$node] = true;
$emails[] = $node;
foreach ($graph[$node] as $neighbor) {
$stack[] = $neighbor;
}
}
}
sort($emails);
$mergedAccounts[] = array_merge([$name], $emails);
}
}

return $mergedAccounts;
}


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM



tgoop.com/yeahub_php_backend/380
Create:
Last Update:

#ЛитКод
Задача: 721. Accounts Merge

Дан список аккаунтов, в котором каждый элемент accounts[i] - это список строк, где первый элемент accounts[i][0] - это имя, а остальные элементы - это email, представляющие электронную почту аккаунта. Теперь мы хотим объединить эти аккаунты. Два аккаунта определенно принадлежат одному человеку, если у обоих аккаунтов есть какой-то общий email. Обратите внимание, что даже если два аккаунта имеют одинаковое имя, они могут принадлежать разным людям, поскольку у людей могут быть одинаковые имена. Изначально у человека может быть любое количество счетов, но все его счета обязательно должны иметь одинаковое имя. После объединения счетов верните счета в следующем формате: первый элемент каждого счета - имя, а остальные элементы - электронные письма в отсортированном порядке. Сами аккаунты могут быть возвращены в любом порядке.

Пример:

nput: accounts = [["John","[email protected]","[email protected]"],["John","[email protected]","[email protected]"],["Mary","[email protected]"],["John","[email protected]"]]
Output: [["John","[email protected]","[email protected]","[email protected]"],["Mary","[email protected]"],["John","[email protected]"]]


👨‍💻 Алгоритм:

1⃣Создайте граф, в котором узлы представляют email-адреса, а ребра соединяют email-адреса, принадлежащие одному аккаунту.

2⃣Пройдите по графу, чтобы найти все связанные компоненты, которые представляют объединенные аккаунты.

3⃣Для каждой связанной компоненты, соберите email-адреса, отсортируйте их и добавьте имя пользователя в начало списка.

😎 Решение:
function accountsMerge($accounts) {
$emailToName = [];
$graph = [];

foreach ($accounts as $account) {
$name = $account[0];
$firstEmail = $account[1];
foreach (array_slice($account, 1) as $email) {
if (!isset($graph[$firstEmail])) $graph[$firstEmail] = [];
if (!isset($graph[$email])) $graph[$email] = [];
$graph[$firstEmail][] = $email;
$graph[$email][] = $firstEmail;
$emailToName[$email] = $name;
}
}

$seen = [];
$mergedAccounts = [];

foreach ($emailToName as $email => $name) {
if (!isset($seen[$email])) {
$emails = [];
$stack = [$email];
while (!empty($stack)) {
$node = array_pop($stack);
if (!isset($seen[$node])) {
$seen[$node] = true;
$emails[] = $node;
foreach ($graph[$node] as $neighbor) {
$stack[] = $neighbor;
}
}
}
sort($emails);
$mergedAccounts[] = array_merge([$name], $emails);
}
}

return $mergedAccounts;
}


👉Новости 👉База вопросов

BY PHP Backend | YeaHub




Share with your friend now:
tgoop.com/yeahub_php_backend/380

View MORE
Open in Telegram


Telegram News

Date: |

How to Create a Private or Public Channel on Telegram? 3How to create a Telegram channel? "Doxxing content is forbidden on Telegram and our moderators routinely remove such content from around the world," said a spokesman for the messaging app, Remi Vaughn. End-to-end encryption is an important feature in messaging, as it's the first step in protecting users from surveillance. Select “New Channel”
from us


Telegram PHP Backend | YeaHub
FROM American