diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..723ef36f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/Letter_Combinations_Phone_Number.php b/Letter_Combinations_Phone_Number.php new file mode 100644 index 000000000..8bc4934fb --- /dev/null +++ b/Letter_Combinations_Phone_Number.php @@ -0,0 +1,48 @@ + 'abc', '3' => 'def', '4' => 'ghi', '5' => 'jkl', + '6' => 'mno', '7' => 'pqrs', '8' => 'tuv', '9' => 'wxyz' + ]; + + $result = []; + $this->backtrack('', $digits, $result, $digitToLetters); + return $result; + + } + + function backtrack($combination, $nextDigits, &$result, $digitToLetters) { + // Если больше нет цифр для проверки + 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); + } + } + } + +} + +$solution = new Solution(); +$solution->letterCombinations(23); +$solution->letterCombinations(''); +$solution->letterCombinations(2); \ No newline at end of file diff --git a/Linked_List_Cycle.php b/Linked_List_Cycle.php new file mode 100644 index 000000000..ffc96215c --- /dev/null +++ b/Linked_List_Cycle.php @@ -0,0 +1,54 @@ +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 ? "Цикл существует" : "Цикла нет"; diff --git a/README.md b/README.md index e16b2a49b..ef540dfcc 100644 --- a/README.md +++ b/README.md @@ -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 \ No newline at end of file