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

@workakkk - админ

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

@pro_python_code - Python

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

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

РКН: clck.ru/3FmrFd
Download 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
📌 Задача. Поиск в повернутом отсортированном массиве

Условие задачи: дан массив, сдвинутый относительно опорного элемента, который неизвестен ( массив после сдвига относительно опорного элемента имеет следующий вид: [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]])

Массив [0,1,2,4,5,6,7], имея опорный элемент 3, будет выглядеть следующим образом: [4,5,6,7,0,1,2].

Необходимо осуществить поиск целевого элемента в сдвинутом массиве, определив его индекс, или же вывести -1 при его отсутствии.

Решение должно быть за O(log n) по времени.

Пример:

Ввод:
nums = [4,5,6,7,0,1,2], target = 0

Вывод: 4

Ввод: nums = [4,5,6,7,0,1,2], target = 3

Вывод: -1

Решение:

class Solution:
def search(self, nums: List[int], target: int) -> int:
if target in nums :
return nums.index(target)
else :
return -1


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

@python_job_interview
Задача. Слияние двух бинарных деревьев

Сложность: Лёгкая

Условие задачи: Даны два бинарных дерева, необходимо осуществить их наложение друг на друга и вывод результатов в новом дереве.

Примечание: Наложение представляет из себя суммирование соответствующих значений из узлов двух деревьев.

Пример:

Ввод:
root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
Вывод:
[3,4,5,5,4,null,7]

Ввод:
root1 = [1], root2 = [1,2]
Вывод:
[2,2]

Решение

Напишем простую рекурсию с функцией constructTree.
Если один из двух узлов не определен, мы можем просто вернуть другой узел.
Если 2 узла не определены, мы можем завершить рекурсию.

class Solution(object):
def mergeTrees(self, root1, root2):

def constructTree(root1, root2):
if not root1 and not root2:
return None
if not root2:
return root1
if not root1:
return root2
head = TreeNode(root1.val + root2.val)
head.left = constructTree(root1.left, root2.left)
head.right = constructTree(root1.right, root2.right)

return head

return constructTree(root1, root2)


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

@python_job_interview
🖥 Задача. Что такое функция sleep в Python?

Это функция встроенноо модуля time, которая позволяет приостановить выполнение программы заданное время. В качестве аргумента принимаются float и int

time.sleep(secs)

Suspend execution of the calling thread for the given number of seconds. The argument may be a floating point number to indicate a more precise sleep time.


Пример

import time

time.sleep(3)

print('Этот текст напечатается через 3 секунды ожидания')


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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача. Какая функция нужна для генерации случайного числа в Python?

Для генерации случайных чисел нужно импортировать модуль random, в котором есть несколько подходящих функций:

random() возвращает случайно число (class 'float') в диапазоне от 0.0 до 1.0 (верхняя граница не входит в диапазон).

from random import random

random() # 0.3380967837329142
random() # 0.07200652051529788


randint(start, stop) возвращает случайное число (class 'int') в диапазоне от start до stop (обе границы включены в диапазон).

from random import randint

randint(1, 7) # 4
randint(1, 7) # 2

randrange(start, stop, step) возвращает случайное число (class 'int') из последовательности от start до stop (верхняя граница не входит в диапазон) с шагом = step. Параметры start и step необязательные, по умолчанию start = 0, step = 1.

from random import randrange

randrange(4) # 1
randrange(4) # 3

random.randrange(4, 10) # 6
random.randrange(4, 10) # 9

random.randrange(4, 10, 2) # 4
random.randrange(4, 10, 2) # 8

#junior

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔑 Задача Ключи и комнаты

Условие: Даны n комнат проиндексированных с 0, все они закрыты кроме комнаты с номером 0. Необходимо посетить все комнаты, однако этого нельзя сдеать не имея ключа от соответствующей закрытой двери.

При посещении какой-либо комнаты в ней находится определенная связка уникальных ключей, номер ключа означет номер комнаты, для которой он отпирает дверь. Можно использовать сразу все связку ключей.

На вход подается массив комнат, где в i-ячейке дан список ключей, находящихся в текущей комнате. Необходимо определеть, можно ли обойти все комнаты.

Сложность: Средняя

Пример:

Ввод:
rooms = [[1],[2],[3],[]]
Вывод:
true
Объяснение:
из 0 комнаты можно попасть в 1, из 1 во 2, из 2 в 3.

Ввод:
rooms = [[1,3],[3,0,1],[2],[0]]
Вывод:
false

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

📌 Решение

@python_job_interview