Python вопросы с собеседований
24.7K subscribers
510 photos
16 videos
17 files
407 links
Вопросы с собеседований по Python

@workakkk - админ

@machinelearning_interview - вопросы с собесдований по Ml

@pro_python_code - Python

@data_analysis_ml - анализ данных на Python

@itchannels_telegram - 🔥 главное в ит

РКН: clck.ru/3FmrFd
Download Telegram
🖥 Auto-resume-raising – программа для автоматического подъема резюме на HeadHunter каждые 4 часа

Альтернатива платной услуге Продвижение.LITE от HeadHunter

🖥 Github: https://github.com/sergo-code/hh-ru-auto-resume-raising

#github #python

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача реализовать экспоненциального поиска.

Экспоненциальный поиск — это еще один алгоритм поиска, который может быть достаточно легко реализован на Python, по сравнению с jump search и поиском Фибоначчи, которые немного сложны. Он также известен под названиями galloping search, doubling search и Struzik search.

Экспоненциальный поиск зависит от бинарного поиска для выполнения окончательного сравнения значений. Алгоритм работает следующим образом:

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

Решение

Реализация алгоритма экспоненциального поиска на Python:

def ExponentialSearch(lys, val):
if lys[0] == val:
return 0
index = 1
while index < len(lys) and lys[index] <= val:
index = index * 2
return BinarySearch( lys[:min(index, len(lys))], val)


Используем функцию, чтобы найти значение:

>>> print(ExponentialSearch([1,2,3,4,5,6,7,8],3))

Рассмотрим работу алгоритма пошагово.

Проверяем, соответствует ли первый элемент списка искомому значению: поскольку lys[0] равен 1, а мы ищем 3, мы устанавливаем индекс равным 1 и двигаемся дальше.

Перебираем все элементы в списке, и пока элемент с текущим индексом меньше или равен нашему значению, умножаем значение индекса на 2:
index = 1, lys[1] равно 2, что меньше 3, поэтому значение index умножается на 2 и переменной index присваивается значение 2.
index = 2, lys[2] равно 3, что равно 3, поэтому значение index умножается на 2 и переменной index присваивается значение 4.
index = 4, lys[4] равно 5, что больше 3. Условие выполнения цикла больше не соблюдается и цикл завершает свою работу.
Затем выполняется двоичный поиск в полученном диапазоне (срезе) lys[:4]. В Python это означает, что подсписок будет содержать все элементы до 4-го элемента, поэтому мы фактически вызываем функцию следующим образом:

>>> BinarySearch([1,2,3,4], 3)
Функция вернет следующий результат:

2

Этот результат является индексом искомого элемента как в исходном списке, так и в срезе, который мы передаем алгоритму бинарного поиска.

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

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

👉 Пишите ваше решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
71_python_projects.pdf
64.1 KB
71 полезный проект для изучения Python.

Видео, статьи и исходный код присутствуют, а если у вас аллергия на PDF — есть ссылка на GitHub.
🖥 Задача с собеседования | Уровень: #Easy

Условие:

Создать функцию которая принимает число и возвращает "Even" для чётных чисел и "Odd" для нечётных.

Пример:

2 → "Even"
1 → "Odd"
-46 → "Even"
71 → "Odd"
0 → "Even"
-123 → "Odd"


👉 Пишите ваше решение в комментариях👇


@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача реализовать алгоритм Jump Search

Jump Search похож на бинарный поиск тем, что он также работает с отсортированным массивом и использует аналогичный подход «разделяй и властвуй» для поиска по нему.

Его можно классифицировать как усовершенствованный алгоритм линейного поиска, поскольку он зависит от линейного поиска для выполнения фактического сравнения при поиске значения.

В заданном отсортированном массиве мы ищем не постепенно по элементам массива, а скачкообразно. Если у нас есть размер прыжка, то наш алгоритм будет рассматривать элементы входного списка lys в следующем порядке: lys[0], lys[0+jump], lys[0+2jump], lys[0+3jump] и так далее.

Решение
С каждым прыжком мы сохраняем предыдущее значение и его индекс. Когда мы находим множество значений (блок), где lys[i] < element < lys[i + jump], мы выполняем линейный поиск с lys[i] в качестве самого левого элемента и lys[i + jump] в качестве самого правого элемента в нашем множестве:

import math
def JumpSearch (lys, val):
length = len(lys)
jump = int(math.sqrt(length))
left, right = 0, 0
while left < length and lys[left] <= val:
right = min(length - 1, left + jump)
if lys[left] <= val and lys[right] >= val:
break
left += jump;
if left >= length or lys[left] > val:
return -1
right = min(length - 1, right)
i = left
while i <= right and lys[i] <= val:
if lys[i] == val:
return i
i += 1
return -1

Поскольку это сложный алгоритм, давайте рассмотрим пошаговое вычисление для следующего примера:

>>> print(JumpSearch([1,2,3,4,5,6,7,8,9], 5))

Jump search сначала определит размер прыжка путем вычисления math.sqrt(len(lys)). Поскольку у нас 9 элементов, размер прыжка будет √9 = 3.
Далее мы вычисляем значение переменной right.

Оно рассчитывается как минимум из двух значений: длины массива минус 1 и значения left + jump, которое в нашем случае будет 0 + 3 = 3. Поскольку 3 меньше 8, мы используем 3 в качестве значения переменной right.
Теперь проверим, находится ли наш искомый элемент 5 между lys[0] и lys[3]. Поскольку 5 не находится между 1 и 4, мы идем дальше.
Затем мы снова делаем расчеты и проверяем, находится ли наш искомый элемент между lys[3] и lys[6], где 6 — это 3 + jump. Поскольку 5 находится между 4 и 7, мы выполняем линейный поиск по элементам между lys[3] и lys[6] и возвращаем индекс нашего элемента:
4

Временная сложность jump search равна O(√n), где √n — размер прыжка, а n — длина списка. Таким образом, с точки зрения эффективности jump search находится между алгоритмами линейного и бинарного поиска.

Единственное наиболее важное преимущество jump search по сравнению с бинарным поиском заключается в том, что он не опирается на оператор деления (/).

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

Стоимость сама по себе очень мала, но когда количество искомых элементов очень велико, а количество необходимых операций деления растет, стоимость может постепенно увеличиваться. Поэтому jump search лучше бинарного поиска, когда в системе имеется большое количество элементов: там даже небольшое увеличение скорости имеет значение.

Чтобы ускорить jump search, мы могли бы использовать бинарный поиск или какой-нибудь другой алгоритм для поиска в блоке вместо использования гораздо более медленного линейного поиска.

👉 Пишите ваше решение в комментариях👇


@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
101 вопрос, на который должен ответить Python-разработчик

Если вы программируете на Python, проверьте свои знания в подборке из 101 вопроса для Python-разработчиков, на которые должен знать ответы любой специалист:

Читать

@python_job_interview
junior_python_developer_questions.pdf
434.1 KB
Некоторые вопросы и ответы с собеседования на позицию Junior Python разработчика на русском

@python_job_interview
101 вопрос, на которые должен ответить Python-разработчик

Готовитесь к собеседованию? Или просто изучаете Python? В этой статье собраны наиболее популярные вопросы по Python, которые помогут проверить ваши знания и подтянуть пробелы:

https://tproger.ru/articles/101-vopros-python-razrabotchiku/

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Практическая задача. Разработать функции для работы с приоритетной очередью

Запрограммировать функции для работы с приоритетной очередью. Очередь запросов формируется согласно приоритету, снятие выполняется подряд, начиная с младших адресов ( то есть с начала очереди).

Очередь должна представлять из себя массив, в котором должен выполняться сдвиг после каждого чтения и сдвиг — после достижения границы памяти, которая выделена для очереди. Приоритет: минимальное значение числового параметра, при совпадении параметров — LIFO.

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Практическая задача.

Требуется написать свой Bruteforce т. е. пользователь вводит какой-то пароль и программа методом перебора всех возможных вариантов находит этот пароль. Предполагается, что программа не может отработать и не найти пароль. Ограничение перебора осуществляется пользователем, т.е будут ли включены в перебор цифры, заглавные буквы, символы и т. д.

Рекомендую ограничить длину вводимого пароля до 4-х символов, больше не надо, иначе программа долго будет работать. Еще лучше, если на этапе разработки программы, длина пароля будет 2 — 3 символа. Кроме того, задайте в программе множество допустимых символов пароля. Например, в пароле могут использоваться только цифры и/или буквы, это заметно поможет ускорить процесс отладки программы-брутфорса.

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача. Количество изолированных островов

Условие задачи: дан двумерный массив, содержащий 0 (острова) и 1(воду).

Остров - множество нулей, соединенных в четырех направлениях (справа, снизу, слева, сверху), изолированый остров - множество нулей, окруженных со всех сторон единицами.

Надо посчитать количество изолированных островов.

Пример:

Ввод:


grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]

Вывод:
2
Объяснение:

Ввод:
grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
Вывод:
1

Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача. Как сделать поиск подстроки в строке через регулярные выражения python?

Проверить строки на шаблон можно с помощью модуля re

# re.findall() ищет все вхождения в строке
text = "He was carefully disguised but captured quickly by police."
re.findall(r"\w+ly\b", text) # ['carefully', 'quickly']

# re.match() позволяет объединять в групыы
m = re.match(r"(\d+)\.(\d+)", "24.1632")
m.groups() # ('24', '1632')


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача. Как вывести строку в алфавитном порядке питон?

Отсортировать строку в алфавитном порядке можно с помощью sorted()

word = 'Python'
# добавим ключ сортировки неучитывающий регистр
sorted(word, key=lambda x: x.lower()) # ['h', 'n', 'o', 'P', 't', 'y']



Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Тестовое задание на позицию код-ревьюера Яндекс.Практикум

Дано
В файле main.py находится пример реального кода, который сдал студент к заданию.
Текст задания находится по ссылке
Общие требования к коду, с которыми ознакамливаются студенты, находятся по ссылке

Что нужно сделать
Нужно провести ревью этого кода. Найти в нем ошибки, неточности, неэффективные места, или дать какие-то необязательные рекомендации по улучшению.
Можно сделать форк репозитория или gist (не делайте Pull Request в этот репозиторий) и расставить комментарии над проблемными строками в main.py.
Учтите, что вы "ревьюите" студента, то есть не надо просто исправлять ошибки, нужно оставлять комментарии и рекомендации.

Как сдавать
В форме прикрепите ссылку на ваш репозиторий или на gist с комментариями.

Github

@python_job_interview
Задача с leetcode. Контейнер с наибольшим количеством воды

Дан целочисленный массив height длины n. Нарисовано n вертикальных линий, две конечные точки i-й линии равны (i, 0) и (i, height[i]). Найдите две линии, которые вместе с осью абсцисс образуют контейнер, содержащий наибольшее количество воды.

Верните максимальное количество воды, которое может храниться в контейнере. Обратите внимание, что вы не можете наклонять контейнер.

Пример 1 (картинка):
Ввод: height = [1,8,6,2,5,4,8,3,7]
Вывод: 49
Объяснение: Вышеуказанные вертикальные линии представлены массивом [1,8,6,2,5,4,8,3,7]. В этом случае максимальная площадь воды (синяя секция), которую может содержать контейнер, составляет 49.

Пример 2:
Ввод: height = [1,1]
Вывод: 1

Решение:

def maxWater(height):
first = 0
end = len(height) -1
ans = 0

while first < end: //condition applied
ans = max(ans, min(height[first], height[end]) * (first - end))
if height[first] < height[end]:
first += 1
else:
end -= 1
return ans

# Working Part
height=[5,1,3,4,6]
print(maxWater(height))


Пишите свое решение в комментариях👇

@python_job_interview
🖥 Реализовать функцию для транскодирования данных, содержащих битовые поля

Реализовать функцию для транскодирования данных, содержащих битовые поля. В решении необходимо использовать побитовые операции. Неиспользуемые поля результата должны содержать нулевые биты.

Входные данные: Шестнадцатиричная строка.

Выходные данные: Десятичная строка.

Тесты должны получится такими:

main('0x9c7421314') = '40975081498'

main('0xa47c30bdf') = '25498361886'

main('0x10e55f488') = '44091072530'

main('0xcdaf1fffb') = '68684267543'


Решение

def transcode(h:str):
v = int(h, 16)
k1 = v & 0xf
k2 = (v >> 4) & 0x1ff
k4 = (v >> 21) & 0x1f
k5 = (v >> 26) & 0x3ff
d = k4 | (k5 << 13) | (k1 << 23)| (k2 << 27)
return str(d)

print(transcode('0x9c7421314'))
print(transcode('0xa47c30bdf'))
print(transcode('0x10e55f488'))
print(transcode('0xcdaf1fffb'))

*** Remote Interpreter Reinitialized ***
[Dbg]>>>
40975081498
25498361886
44091072530
68684267543


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как получить кодировку строки python?

Можно воспользоваться сторонними библиотеками, как например, UnicodeDammit

Но, к сожалению, однозначно узнать кодировку строки невозможно. Есть конечно определенные маркеры у кодировок ASCII, UTF-8, UTF-16, но, вцелом, для компьютера текст это просто какой-то набор байтов, и переводит он по таблице, где каждому набору соответствует какой-то символ. Но само собой он не понимает правильный ли для нас людей это символ, или нет.

Пишите свое мнение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM