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
Если вы программируете на Python, проверьте свои знания в подборке из 101 вопроса для Python-разработчиков, на которые должен знать ответы любой специалист:
▪ Читать
@python_job_interview
junior_python_developer_questions.pdf
434.1 KB
Некоторые вопросы и ответы с собеседования на позицию Junior Python разработчика на русском
@python_job_interview
@python_job_interview
101 вопрос, на которые должен ответить Python-разработчик
Готовитесь к собеседованию? Или просто изучаете Python? В этой статье собраны наиболее популярные вопросы по Python, которые помогут проверить ваши знания и подтянуть пробелы:
https://tproger.ru/articles/101-vopros-python-razrabotchiku/
#python
Готовитесь к собеседованию? Или просто изучаете Python? В этой статье собраны наиболее популярные вопросы по Python, которые помогут проверить ваши знания и подтянуть пробелы:
https://tproger.ru/articles/101-vopros-python-razrabotchiku/
#python
🚀Франция
https://candidat.pole-emploi.fr/espacepersonnel/
https://www.indeed.fr
https://www.monster.fr
🚀Германия
https://stellenmarkt.sueddeutsche.de/
https://www.arbeitsagentur.de/
https://www.monster.de/
https://www.horizontjobs.de/
🚀Италия
https://www.careerjet.it/
https://www.monster.it/
https://it.indeed.com/
https://www.infojobs.it/
🚀Испания
https://www.infojobs.net/
https://www.monster.es/
https://www.infoempleo.com/
🚀США
www.indeed.com
https://www.careerbuilder.com/
https://craiglist.com/
www.monster.com
https://www.vacancyopen.com/
🚀Чехия
https://www.jobs.cz/
https://www.profesia.cz/
https://www.prace.cz/
https://www.dobraprace.cz/
www.dzob.cz
🚀Польша
https://www.pracuj.pl/
https://www.jobs.pl
https://gazetapraca.pl/
www.gowork.pl
🚀Великобритания
https://www.indeed.co.uk
https://www.monster.co.uk/advertise-a-job/
https://www.cv-library.co.uk/
🚀Швеция
https://www.monster.se/
https://www.jobbsafari.se/
https://www.metrojobb.se/
🚀Австралия
https://jobsearch.gov.au
www.seek.com.au
www.careerone.com.au
🚀Венгрия
https://nofluffjobs.com/hu/
🚀Канада
www.workopolis.com
https://www.canadajobs.com
https://ca.indeed.com
https://www.monster.ca/
🚀Латвия
https://www.cv.lv/lv/
🚀Турция
https://www.yenibiris.com/
https://www.kariyer.net/
https://turkey.xpatjobs.com/
#vacancy #job
@python_job_interview
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
Проверить строки на шаблон можно с помощью модуля 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
Дано
▪В файле 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
Решение:
Пишите свое решение в комментариях👇
@python_job_interview
Дан целочисленный массив 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
Можно воспользоваться сторонними библиотеками, как например, UnicodeDammit
Но, к сожалению, однозначно узнать кодировку строки невозможно. Есть конечно определенные маркеры у кодировок
ASCII, UTF-8, UTF-16
, но, вцелом, для компьютера текст это просто какой-то набор байтов, и переводит он по таблице, где каждому набору соответствует какой-то символ. Но само собой он не понимает правильный ли для нас людей это символ, или нет.Пишите свое мнение в комментариях👇
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача. Поиск в повернутом отсортированном массиве
Условие задачи: дан массив, сдвинутый относительно опорного элемента, который неизвестен ( массив после сдвига относительно опорного элемента имеет следующий вид:
Массив
Необходимо осуществить поиск целевого элемента в сдвинутом массиве, определив его индекс, или же вывести -1 при его отсутствии.
Решение должно быть за O(log n) по времени.
Пример:
Ввод:
Вывод: 4
Ввод:
Вывод: -1
Решение:
@python_job_interview
Условие задачи: дан массив, сдвинутый относительно опорного элемента, который неизвестен ( массив после сдвига относительно опорного элемента имеет следующий вид:
[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]
Решение
Напишем простую рекурсию с функцией
▪Если один из двух узлов не определен, мы можем просто вернуть другой узел.
▪Если 2 узла не определены, мы можем завершить рекурсию.
Пишите свое мнение в комментариях👇
@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
Это функция встроенноо модуля 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
Для генерации случайных чисел нужно импортировать модуль 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
Условие: Даны 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