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

@workakkk - админ

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

@pro_python_code - Python

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

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

РКН: clck.ru/3FmrFd
加入频道
📌 Проверка: является ли строка палиндромом?

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

Условие: палиндромом является фраза, которая после перевода в нижний регистр всех символов, а также удаления всех знаков препинания, читается одинаково как слева направо, так и справа налево.

Задача - вернуть true, если строка палиндром, false - в противном случае.

Пример:

Ввод: s = "A man, a plan, a canal: Panama"
Вывод: true
Объяснение: "amanaplanacanalpanama" является палиндромом.

Ввод: s = "race a car"
Вывод: false
Объяснение: "raceacar" не является палиндромом.

Ввод: s = " "
Вывод: true
Объяснение: s - пустая строка "" после удаления всех знаков препинания и пробелов.
Так как пустая строка читается одинаково в обоих направлениях, то она является палиндромом.

Решение с использвоанием регулярного выражения

import re

class Solution(object):
def isPalindrome(self, s):
new_s = re.sub(r"[^a-zA-Z0-9\\s+]", "", s).lower()
return new_s == new_s[::-1]


re.sub(pattern, replaceString): все совпадающие вхождения указанного шаблона заменяются, указанной строкой (здесь пустая строка, так как мы хотим удалить).

Давайте объясним шаблон:

[^ ]: Сопоставляет один символ, не присутствующий в списке ниже.
a-zA-Z: Сопоставляет все буквы верхнего и нижнего регистров.
0-9: совпадает с цифрами.
\s+: Сопоставляет строку символов, не являющихся пробелами.
Добавляем \, первый из которых "просит" Python не интерпретировать последующие.
Наконец, шаблон совпадает со всеми неалфавитными символами, а re.sub() позволяет нам удалить все встречающиеся символы из строки.

new_s[::-1] используется для переворачивания строки.

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

@python_job_interview
🔢 Задача на теорию чисел

Для того чтобы проверить, как её ученики умеют считать, Мария Ивановна каждый год задаёт им на дом одну и ту же задачу — для заданного натурального A найти минимальное натуральное N такое, что N в степени N (N, умноженное на себя N раз) делится на A.

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

Решение:
def decomp(n):
ans = []
d = 2
while d * d <= n:
if n % d == 0:
ans.append(d)
n //= d
else:
d += 1
if n > 1:
ans.append(n)
return ans



x = int(input())
if x == 1:
print(1)
else:
a = list(set(decomp(x)))
b = decomp(x)

y = 1
for i in range(len(a)):
y *= a[i]
k = 1
n = k*y

if a[0] != x:
for i in range(40):
t = (i+1)*y
if pow(t, t, x) == 0:
print((i+1) * y)
break
else:
print(a[0])


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

@python_job_interview
8 крутых способов свести функции Python в одну строку

Видео

@python_job_interview
Найти максимальный подмассив

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

Условие задачи: дан целочисленный массив, необходимо найти в нем такой подмассив, сумма элементов в котором будет максимальной.

Подмассивом называется последовательная часть исходного массива.

Пример:

Ввод:
nums = [-2,1,-3,4,-1,2,1,-5,4]
Вывод:
6

Объяснение:
4,-1,2,1] имеет наибольшую сумму 6.

Ввод:
nums = [5,4,-1,7,8]
Вывод:
23

Решение:

class Solution:
def maxSubArray(self, nums: List[int]) -> int:
Max = nums[0]
Sum = 0
for num in nums:
Sum += num
Max = max(Max, Sum)
if Sum<0:
Sum = 0
return Max


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

@python_job_interview
📌 Задача палиндром наибольшей длины, полученный с помощью соединений из слов, состоящих из двух букв.

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

Условие задачи: дан массив строк, каждый элемент которого состоит из двух букв английского алфавита в нижнем регистре.

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

В ответе надо вернуть длину такого палидрома.


Палиндром - строка, которая одинаково читаются слева направо и справа налево.

Пример:

Ввод:
words = ["lc","cl","gg"]
Вывод: 6
Объяснение: lc" + "gg" + "cl" = "lcggcl" или же "clgglc", но оба имеют максимальную длину 6.

Ввод: words = ["ab","ty","yt","lc","cl","ab"]
Вывод: 8
Объяснение: "ty" + "lc" + "cl" + "yt" = "tylcclyt" или "lcyttycl"

Ввод: words = ["cc","ll","xx"]
Вывод: 2

Решение

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

@python_job_interview
🖥 Задача топ k наиболее часто встречающихся элементов

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

Условие задачи: Дан целочисленный массив и целое число k. Необходимо вернуть k часто встречающихся элементов. Порядок чисел в ответе не имеет значения.

Гарантируется, что ответ уникальный. То есть несколько элементов не могут встречаться одинаковое количество раз.

Пример:

Ввод: nums = [1,1,1,2,2,3], k = 2
Вывод: [1,2]

Ввод: nums = [1], k = 1
Вывод: [1]

Решение:

class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
return [key for key, _ in Counter(nums).most_common(k)]


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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача расшифровка строки

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

Условие задачи: дана строка в формате: k[encoded_string], где k - число повторений зашифрованной строки. Необходимо вывести результирующую строку, которая соответствует расшифровке исходной строки.

Пример:

Ввод:
s = "3[a]2[bc]"
Вывод: "aaabcbc"

Ввод:
s = "3[a2[c]]"
Вывод: "accaccacc"

Решение:

class Solution:
def decodeString(self, s: str) -> str:
stack = []
cur = ""
k = 0
for c in s:
if c == "[":
stack.append((cur, k))
cur, k = "", 0 # reset global vars
elif c == "]":
enc, n = stack.pop()
cur = enc + n * cur
elif c.isdigit():
k = k * 10 + int(c) # for two and three digit numbers
else:
cur += c # track the lower case letters
return cur


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

@python_job_interview
🖥 Реализация стека через очередь

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

Условие задачи: нужно реализовать стркутуру "последний зашел - первый вышел" используя только две очереди. Реализованная струкутура должна поддерживать функции обычного стека (добавления в стек, удаление верхнего элемента стака, возврат верхнего элемента стака, проверка на наличие элемнтов в стеке).

Пример:

Ввод:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
Вывод: [null, null, null, 2, 2, false]

Объяснение:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // return 2
myStack.pop(); // return 2
myStack.empty(); // return False

Решение:

class MyStack:

def __init__(self):
self.stack=[]

def push(self, x: int) -> None:
self.stack.append(x)

def pop(self) -> int:
return self.stack.pop()

def top(self) -> int:
return self.stack[-1]

def empty(self) -> bool:
if self.stack==[]:
return True
return False


# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()


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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача с собеседования от подписчика

написать программу, которая будет считывать с клавиатуры 4 десятичных числа x, y, m, n.

В числе x младшие m бит заменить на старшие m бит из числа y, потом инвертировать n младших бит в числе y. Все смещения бит указываются начиная с младшего (нулевого) бита.

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

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

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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Алгоритмическая Задача.

#middle

На прямой даны N отрезков (в реальной жизни это могут быть промежутки времени, например), которые заданы координатами их левого и правого конца.

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

Предложите как можно более эффективный способ решения этой задачи.

Гарантируется, что все концы данных отрезков различны.

Сможете ли вы решить эффективно данную задачу в случае, если концы отрезков могут совпадать?

Решение за О(n2) (полный перебор)
Давайте для каждого отрезка из набора перебером найдем все отрезки, для которых выполняется условие «вложенности». Если да, то увеличим ответ для текущего рассматриваемого нами отрезка на единицу. Несложно понять, что данное решение работает за O(n2): для каждого из N отрезков мы перебираем N отрезков. Можно ли быстрее? Да!

Алгоритм решения за О(n log n) (сортировка + структуры данных)
Отсортируем все отрезки по левому концу и будем рассматривать их в уже отсортированном порядке. Вспомним условие «вложенности»: левый конец первого отрезка правее левого конца второго отрезка, и правый конец первого отрезка левее правого конца второго отрезка. Несложно понять, что благодаря отсортированности все левые концы еще нерасмотренных отрезков будут правее левого конца рассматриваемого отрезка. Таким образом, все нерасмотренные отрезки потенциально являются вложенными в рассматриваемый: ведь для них уже выполняется одно из двух условий «вложенности» (про левые концы). Осталось узнать, сколько из них действительно являются таковыми — для этого нужно понять, сколько из нерассмотренных отрезков имеют правый конец левее правого конца рассматриваемого отрезка.

Для этого будем поддерживать структуру данных, которая может добавить и удалять из себя числа и отвечать на запросы вида: «сколько чисел во мне меньше X?», причем все операции должны выполняться за
O(log n). Такой структурой данных может быть, например, декартово дерево, дерево Фенвика, . Перед выполнением алгоритма для решения задачи сложим в нашу структуру координаты всех правых концов отрезков.

Теперь, чтобы узнать сколько из нерассмотренных отрезков имеют правый конец левее правого конца рассматриваемого отрезка, достаточно просто осуществить запрос к структуре данных «сколько чисел в тебе меньше, чем координата правого конца рассматриваемого отрезка». Ответ на этот запрос и будет ответом для рассматриваемого на данный момент нами отрезка. После запроса необходимо убрать координату правого конца отрезка из структуры данных, чтобы ответы для всех следующих отрезков были корректны: ведь левый конец рассматриваемого отрезка левее (благодаря отсортированности) левый концов всех еще нерасмотренных отрезков.

Докажем, что данное решение работает за
О(n log n). Сортировка всех отрезков происходит за O(n log n), складывание всех правых концов отрезков в структуру данных за O(n log n), на стадии вычисления ответов мы рассмотрим n отрезков, для каждого из которых осуществим два запроса, оба из которых выполнятся за О(log n). Таким образом, вычисляем все ответы мы за O(n log n) с препроцессингом за O(n log n), а значит, и асимптотика всего решения O(n log n).

Повышаем сложность
Сможете ли вы решить эффективно данную задачу в случае, если концы отрезков могут совпадать?

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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
OpenResume - это инструмент для создания резюме с открытым исходным кодом. Он позволяет пользователям выбирать готовые шаблоны и заполнять информацию о себе в специальные поля без необходимости уделять внимание дизайну. Конструктор автоматически преобразует введенные данные. Кроме того, если у вас уже есть резюме в формате PDF, его можно импортировать в программу и редактировать по своему усмотрению, даже изменить дизайн в считанные секунды.

Дополнительным преимуществом является то, что все функции OpenResume абсолютно бесплатны и не требуют регистрации. Все пользовательские данные хранятся локально и не отправляются в сеть.

Github

@python_job_interview
🖥 Задача для новичков.

Напишите функцию, которая переворачивает булево значение и возвращает строку “boolean expected”, если передан другой тип переменной.”

Пример:
reverse(True) ➞ False
reverse(False) ➞ True
reverse(0) ➞ "boolean expected"
reverse(None) ➞ "boolean expected"


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

#junior

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача: Список победителей

Условие: Длинна трассы — 43872 м, а зрители хотят узнать имя победителя.

Нам известны средние скорости трёх фаворитов – Пети, Васи и Толи. Помогите подвести итоги гонки.

Формат ввода
В первой строке записана средняя скорость Пети.
Во второй — Васи.
В третьей — Толи.

• Формат вывода
Имена победителей в порядке занятых мест.

• Пример 1
Ввод
10
5
7


• Вывод
1. Петя
2. Толя
3. Вася

Код:

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

#junior

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Docker?

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

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

Развертывание приложений: Docker упрощает процесс развертывания, предоставляя согласованную и воспроизводимую среду.
Архитектура микросервисов: Docker часто используется в микросервисных архитектурах, где приложения разбиваются на более мелкие, независимые сервисы.
Непрерывная интеграция и непрерывное развертывание (CI/CD): Docker широко используется в конвейерах CI/CD для обеспечения последовательных и воспроизводимых сборок и развертываний.
Среды разработки и тестирования: Docker упрощает создание сред разработки и тестирования за счет инкапсуляции необходимых зависимостей в контейнеры.
Масштабируемость и балансировка нагрузки: Docker облегчает горизонтальное масштабирование приложений за счет параллельного запуска нескольких контейнеров.
Гибридные и мультиоблачные развертывания: Контейнеры Docker обеспечивают гибкость при развертывании приложений в различных средах, включая локальную инфраструктуру, публичные облака или гибридные облачные системы.
#вопросы_с_собеседований
Целое число английскими словами

Сложность задачи: Hard

Условие задачи:
Преобразуйте неотрицательное целое число num в его буквенное представление английскими словами.

Пример:
Ввод: num = 123
Вывод: "One Hundred Twenty Three"

Ввод: num = 12345
Вывод: "Twelve Thousand Three Hundred Forty Five"

Решение задачи

Пишите свое решение в комментариях👇
🖥 Напишите класс PipManager, в котором определите следующие методы:

show_pip_version() – вывод версии менеджера;
show_pip_help() – вывод справки по менеджеру;
install_package(package_name) – установка пакета;
upgrade_package(package_name) – обновление пакета;
show_package_info(package_name) – вывод информации о пакете;
show_packages() – вывод списка установленных пакетов;
uninstall_package(package_name) – удаление пакета.

Используя возможности созданного класса, дополните скрипт так, чтобы он смог выполнить предыдущее упражнение в автоматическом режиме.


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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Задача золотой массив

Пролог
Миша учится в классе, в котором у каждого ученика есть рейтинг успеваемости. Иван Иванович (ИИ) - учитель информатики перед каждым уроком получает массив с рейтингом учеников, которые придут. Он хочет рассадить их определённым образом, а Миша хочет 5 по информатике, и он решил написать программу, которая поможет ИИ.

Задание
Вам дается массив целых чисел [students]. Массив [students] понравится ИИ если:

Длина массива - четное число (чтобы у каждого ученика был сосед по парте, ученик без соседа отправится ИИ на другой урок)
students[i] != students[i+1] для всех учеников на четных позициях (ИИ хочет, чтобы ученики с одинаковым рейтингом не сидели за одной партой; первые два элемента массива - ученики за первой партой, следующие два элемента - за второй и тд.)
Пустой массив тоже понравится ИИ, потому что тогда вместо урока он пойдет в столовую пить чай.

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

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

Пример:

Ввод: students = [1, 1, 2, 3, 5]
Вывод: 1
Мы можем удалить или students[0] или students[1], этого будет достаточно, чтобы массив понравился ИИ - students[1, 2, 3, 5].

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

@python_job_interview
⚡️Маст-хэв список для программистов, каналы с последними книжными новинками, библиотеками, разбором кода и актуальной информацией, связанной с вашим языком программирования.
Лучший способ получать свежие обновлении и следить за трендами в разработке.

Машинное обучение: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
C#: t.me/csharp_ci
C/C++/ t.me/cpluspluc
Data Science: t.me/data_analysis_ml
Devops: t.me/devOPSitsec
Go: t.me/Golang_google
Базы данных: t.me/sqlhub
Rust: t.me/rust_code
Javascript: t.me/javascriptv
React: t.me/react_tg
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Linux: t.me/+A8jY79rcyKJlYWY6
Big Data: t.me/bigdatai
Хакинг: t.me/linuxkalii
Тестирование: https://yangx.top/+F9jPLmMFqq1kNTMy
Java: t.me/javatg

💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy

Папка машинное обучение: https://yangx.top/addlist/_FjtIq8qMhU0NTYy

📕 Бесплатные Книги для программистов: https://yangx.top/addlist/YZ0EI8Ya4OJjYzEy

🎞 YouTube канал: https://www.youtube.com/@uproger

😆ИТ-Мемы: t.me/memes_prog

🇬🇧Английский: t.me/english_forprogrammers
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Найти максимальный по модулю элемент в массиве с уникальными по модулю значениями

📌 ЗАДАЧА
Заполнить массив случайными положительными и отрицательными числами таким образом, чтобы все числа по модулю были разными. Это значит, что в массиве не может быть ни только двух равных чисел, но не может быть двух равных по модулю. В полученном массиве найти наибольшее по модулю число.

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

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

Решение:

from random import random<br>
N = 15<br>
m = int(random() * 40) - 20<br>
arr = [m]<br>
i = 1<br>
while i < N:<br>
m = int(random() * 40) - 20<br>
f = 1<br>
for j in arr:<br>
if abs(j) == abs(m):<br>
f = 0<br>
break<br>
if f == 1:<br>
arr.append(m)<br>
i += 1<br>
print(arr)<br>
j = 0<br>
for i in range(1, 15):<br>
if abs(arr[i]) > abs(arr[j]):<br>
j = i<br>
print('Максимальный по модулю %d-й элемент равен %d' % (j,arr[j]))<br>


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

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