Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Akolosova/hw14 #1188

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
48 changes: 48 additions & 0 deletions Letter_Combinations_Phone_Number.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

class Solution {

Check failure on line 3 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Each class must be in a namespace of at least one level (a top-level vendor name)

Check failure on line 3 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Opening brace must not be followed by a blank line

Check failure on line 3 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Opening brace of a class must be on the line after the definition

/**
* @param String $digits
* @return String[]
*/

function letterCombinations($digits) {

Check failure on line 10 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Visibility must be declared on method &quot;letterCombinations&quot;

Check failure on line 10 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Opening brace should be on a new line

if (empty($digits)) {
return [];
}

$digitToLetters = [
'2' => 'abc', '3' => 'def', '4' => 'ghi', '5' => 'jkl',
'6' => 'mno', '7' => 'pqrs', '8' => 'tuv', '9' => 'wxyz'
];

$result = [];
$this->backtrack('', $digits, $result, $digitToLetters);
return $result;

}

Check failure on line 25 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Function closing brace must go on the next line following the body; found 1 blank lines before brace

function backtrack($combination, $nextDigits, &$result, $digitToLetters) {

Check failure on line 27 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Visibility must be declared on method &quot;backtrack&quot;

Check failure on line 27 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Opening brace should be on a new line
// Если больше нет цифр для проверки
if (empty($nextDigits)) {
// Комбинация завершена
$result[] = $combination;
} else {
// Получаем буквы, соответствующие следующей доступной цифре
$letters = $digitToLetters[$nextDigits[0]];
// Для каждой буквы вариантов
for ($i = 0; $i < strlen($letters); $i++) {
// Добавляем текущую букву к комбинации и переходим к следующим цифрам
$this->backtrack($combination . $letters[$i], substr($nextDigits, 1), $result, $digitToLetters);
}
}
}

}

Check failure on line 43 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

The closing brace for the class must go on the next line after the body

$solution = new Solution();
$solution->letterCombinations(23);
$solution->letterCombinations('');
$solution->letterCombinations(2);

Check failure on line 48 in Letter_Combinations_Phone_Number.php

View workflow job for this annotation

GitHub Actions / phpcs

Expected 1 newline at end of file; 0 found
54 changes: 54 additions & 0 deletions Linked_List_Cycle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

class ListNode {
public $val;
public $next;
function __construct($val = 0, $next = null) {
$this->val = $val;
$this->next = $next;
}
}

class Solution {
/**
* @param ListNode $head
* @return Boolean
*/
function hasCycle($head) {

if ($head == null || $head->next == null) {
return false;
}

$slow = $head;
$fast = $head->next;

while ($slow !== $fast) {
if ($fast == null || $fast->next == null) {
return false;
}
$slow = $slow->next;
$fast = $fast->next->next;
}

return true;
}
}

// Создаем узлы
$node1 = new ListNode(1);
$node2 = new ListNode(2);
$node3 = new ListNode(3);
$node4 = new ListNode(4);

// Формируем связи
$node1->next = $node2;
$node2->next = $node3;
$node3->next = $node4;
// Создаем цикл: последний узел связываем с первым узлом
$node4->next = $node1;

$solution = new Solution();
// Проверяем наличие цикла
$result = $solution->hasCycle($node1);
echo $result ? "Цикл существует" : "Цикла нет";
48 changes: 47 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,49 @@
# PHP_2023

https://otus.ru/lessons/razrabotchik-php/?utm_source=github&utm_medium=free&utm_campaign=otus

17:

n - общее количество цифр во входной строке.
m - среднее количество букв, которые соответствуют одной цифре
(например, для цифр 7 и 9, где каждой цифре соответствует 4 буквы, m = 4).

Алгоритм использует обратную трассировку (backtracking), чтобы сгенерировать все возможные комбинации букв,
соответствующие заданным цифрам. Каждый уровень рекурсии соответствует одной цифре во входной строке,
а на каждом уровне рекурсии мы должны рассмотреть m вариантов букв для текущей цифры.

Таким образом, общее количество операций,
которые алгоритм должен выполнить, будет пропорционально количеству комбинаций букв,
которые можно сформировать из данной строки цифр. Это равно m^n,
так как для каждой цифры во входной строке мы имеем m вариантов букв.

Временная сложность алгоритма составляет O(m^n).
Однако стоит отметить, что общее количество возможных комбинаций может быть ограничено,
так как длина входной строки ограничена 4 цифрами (в соответствии с ограничениями задачи),
поэтому фактическая сложность будет зависеть от конкретных входных данных.



141:

Это алгоритм "бегущего указателя" (Floyd's Tortoise and Hare algorithm)

n - количество узлов в связанном списке.
Алгоритм использует два указателя: медленный (slow) и быстрый (fast).
Медленный указатель перемещается на один шаг за каждую итерацию, а быстрый - на два шага.

В худшем случае, когда в связанном списке нет цикла, быстрый указатель дойдет до конца списка,
который занимает O(n) времени, так как он проходит через каждый узел один раз.
Поэтому временная сложность алгоритма в этом случае составляет O(n).

В случае, если в списке есть цикл, алгоритм также найдет его за O(n) времени.
Однако количество итераций может быть меньше, чем общее количество узлов в списке,
поскольку быстрый указатель сначала "пройдет" по некоторому количеству узлов вне цикла,
прежде чем войти в него. В любом случае, время выполнения зависит
от длины цикла и его относительного расположения в списке.

Таким образом, общая временная сложность алгоритма "бегущего указателя" для определения
наличия цикла в связанном списке составляет O(n).



17
Loading