Мои собеседования (Golang developer)
Привет, меня зовут Олег, я разработчик со стажем почти 10 лет.
Разработкой начал заниматься ещё со старшей школы, изучал C/C++ (очень пригодилось при написании скриптов в injection для ультимы онлайн). Профессионально начал работать разработчиком приблизительно с 2014, основной язык до 2020 года был C# с примесью C++. Сначала разрабатывал и поддерживал некоторые проекты в банковской сфере, потом резко поменял предметную область и ушёл писать софт для автоматизации работы одного строительного девелопера. На начальных этапах это было огромное легаси на C# от бывшего архитектора, решившего стать программистом, с кучей багов и неочевидных решений, пришлось много переписывать.
Со временем появились задачи, которые не были привязаны к языку и технологиям в принципе (изначально писал, по сути, плагины к CAD-приложениям), и я попробовал Golang, а вместе с ним и микросервисы, NoSQL, gRPC и прочие модные штуки. Побывал в шкуре админа-девопса, так как новые сервисы я запускал и поддерживал сам.
Некоторое время назад наткнулся на пост про собеседования и решил рассказать Хабру про свой опыт. Возможно, кому-то он окажется полезным.
▪ Читать
@golang_interview
Привет, меня зовут Олег, я разработчик со стажем почти 10 лет.
Разработкой начал заниматься ещё со старшей школы, изучал C/C++ (очень пригодилось при написании скриптов в injection для ультимы онлайн). Профессионально начал работать разработчиком приблизительно с 2014, основной язык до 2020 года был C# с примесью C++. Сначала разрабатывал и поддерживал некоторые проекты в банковской сфере, потом резко поменял предметную область и ушёл писать софт для автоматизации работы одного строительного девелопера. На начальных этапах это было огромное легаси на C# от бывшего архитектора, решившего стать программистом, с кучей багов и неочевидных решений, пришлось много переписывать.
Со временем появились задачи, которые не были привязаны к языку и технологиям в принципе (изначально писал, по сути, плагины к CAD-приложениям), и я попробовал Golang, а вместе с ним и микросервисы, NoSQL, gRPC и прочие модные штуки. Побывал в шкуре админа-девопса, так как новые сервисы я запускал и поддерживал сам.
Некоторое время назад наткнулся на пост про собеседования и решил рассказать Хабру про свой опыт. Возможно, кому-то он окажется полезным.
▪ Читать
@golang_interview
Арифметическое выражение (arith.go)
Составьте программу arith.go, вычисляющую значение скобочного арифметического выражения.
Арифметическое выражение считывается из аргументов командной строки и представляет собой строку, содержащую целые числа от 0 до 2 в 31 степени, знаки четырёх арифметических операций, имена переменных, круглые скобки и пробелы. Имена переменных представляют собой последовательности латинских букв и цифр, начинающиеся с буквы. Арифметические операции — целочисленные, то есть 5/2 даёт 2, а не 2.5. Пробелы не несут никакого смысла и должны игнорироваться программой.
Примеры выражений, которые могут быть поданы на вход программе:
Грамматика для арифметических выражений записывается как
Здесь number и var обозначают множества терминальных символов, соответствующих числам и именам переменных.
После удаления левой рекурсии получается LL(1)-грамматика
Алгоритм вычисления значения выражения должен быть разбит на две части: лексический анализатор и синтаксический анализатор.
Задачей лексического анализатора является разбиение арифметического выражения на лексемы, то есть выделение в нём числовых констант, имён переменных, знаков операций и круглых скобок. Пробелы во время лексического анализа пропускаются. Каждая лексема представляется в виде экземпляра структуры Lexem:
Здесь Image — подстрока арифметического выражения, соответствующая распознанной лексеме, а Tag — целочисленный код, задающий тип лексемы:
Значения кодов лексем образуют степени двойки, чтобы можно было эффективно проверять принадлежность текущей лексемы некоторому множеству лексем. Например, если lx — переменная, в которой хранится текущая лексема, то проверить, является ли она аддитивной арифметической операцией, можно следующим образом:
Лексический анализатор должен выполняться в отдельной go-программе, получающей на вход арифметическое выражение и канал лексем и отправляющей распознанные лексемы в этот канал:
Синтаксический анализатор должен быть составлен методом рекурсивного спуска по приведённой LL(1)-грамматике.
Программа должна запрашивать у пользователя значения переменных, входящих в выражение, и выводить в стандартный поток вывода значение выражения или сообщение «error», если выражение содержит синтаксическую ошибку. Если некоторая переменная входит в выражение многократно, её значение всё равно должно запрашиваться только один раз.
@golang_interview
Составьте программу arith.go, вычисляющую значение скобочного арифметического выражения.
Арифметическое выражение считывается из аргументов командной строки и представляет собой строку, содержащую целые числа от 0 до 2 в 31 степени, знаки четырёх арифметических операций, имена переменных, круглые скобки и пробелы. Имена переменных представляют собой последовательности латинских букв и цифр, начинающиеся с буквы. Арифметические операции — целочисленные, то есть 5/2 даёт 2, а не 2.5. Пробелы не несут никакого смысла и должны игнорироваться программой.
Примеры выражений, которые могут быть поданы на вход программе:
-x * (x+10) * (128/x-5)
Length * Height * Depth
Грамматика для арифметических выражений записывается как
<E> ::= <E> + <T> | <E> - <T> | <T>.
<T> ::= <T> * <F> | <T> / <F> | <F>.
<F> ::= <number> | <var> | ( <E> ) | - <F>.
Здесь number и var обозначают множества терминальных символов, соответствующих числам и именам переменных.
После удаления левой рекурсии получается LL(1)-грамматика
<E> ::= <T> <E'>.
<E'> ::= + <T> <E'> | - <T> <E'> | .
<T> ::= <F> <T'>.
<T'> ::= * <F> <T'> | / <F> <T'> | .
<F> ::= <number> | <var> | ( <E> ) | - <F>.
Алгоритм вычисления значения выражения должен быть разбит на две части: лексический анализатор и синтаксический анализатор.
Задачей лексического анализатора является разбиение арифметического выражения на лексемы, то есть выделение в нём числовых констант, имён переменных, знаков операций и круглых скобок. Пробелы во время лексического анализа пропускаются. Каждая лексема представляется в виде экземпляра структуры Lexem:
type Lexem struct {
Tag
Image string
}
Здесь Image — подстрока арифметического выражения, соответствующая распознанной лексеме, а Tag — целочисленный код, задающий тип лексемы:
type Tag int
const (
ERROR Tag = 1 << iota // Неправильная лексема
NUMBER // Целое число
VAR // Имя переменной
PLUS // Знак +
MINUS // Знак -
MUL // Знак *
DIV // Знак /
LPAREN // Левая круглая скобка
RPAREN // Правая круглая скобка
)
Значения кодов лексем образуют степени двойки, чтобы можно было эффективно проверять принадлежность текущей лексемы некоторому множеству лексем. Например, если lx — переменная, в которой хранится текущая лексема, то проверить, является ли она аддитивной арифметической операцией, можно следующим образом:
if lx.Tag & (PLUS | MINUS) != 0 {
...
}
Лексический анализатор должен выполняться в отдельной go-программе, получающей на вход арифметическое выражение и канал лексем и отправляющей распознанные лексемы в этот канал:
func lexer(expr string, lexems chan Lexem) {
...
}
Синтаксический анализатор должен быть составлен методом рекурсивного спуска по приведённой LL(1)-грамматике.
Программа должна запрашивать у пользователя значения переменных, входящих в выражение, и выводить в стандартный поток вывода значение выражения или сообщение «error», если выражение содержит синтаксическую ошибку. Если некоторая переменная входит в выражение многократно, её значение всё равно должно запрашиваться только один раз.
@golang_interview
Паттерны и практики Go
Слайды + заметки с презентации Abhinav Gupta о нескольких шаблонах и передовых методах, которые вы можете использовать для разработки Go-библиотек, совместимых с предыдущими версиями.
Слайды + заметки с презентации Abhinav Gupta о нескольких шаблонах и передовых методах, которые вы можете использовать для разработки Go-библиотек, совместимых с предыдущими версиями.
abhinav.github.io
Go Patterns and Practices
Экспоненциальный поиск — это еще один алгоритм поиска, который может быть достаточно легко реализован на Python, по сравнению с jump search и поиском Фибоначчи, которые немного сложны. Он также известен под названиями galloping search, doubling search и Struzik search.
Экспоненциальный поиск зависит от бинарного поиска для выполнения окончательного сравнения значений. Алгоритм работает следующим образом:
Определяется диапазон, в котором, скорее всего, будет находиться искомый элемент.
В этом диапазоне используется двоичный поиск для нахождения индекса элемента.
Пишите свое решение в комментариях👇
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
9%
0
6%
1
2%
2
23%
Любое число >=1
32%
Ошибка компиляции
27%
Посмотреть результаты
package main
import "fmt"
func foo(a []int) {
a[1] = 5
}
func bar(a []int) {
for i := 0; i < len(a); i += 2 {
a[i], a[i+1] = a[i+1], a[i]
}
}
func main() {
a := []int{1, 2, 3, 4, 5, 6}
fmt.Printf("a[1]=%d\n", a[1])
foo(a)
fmt.Printf("a[1]=%d\n", a[1]) // что выведет?
bar(a)
fmt.Printf("a=%v\n", a) // печатает весь слайс, что здесь выведет?
}
Ответ
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Запрограммировать функции для работы с приоритетной очередью. Очередь запросов формируется согласно приоритету, снятие выполняется подряд, начиная с младших адресов ( то есть с начала очереди).
Очередь должна представлять из себя массив, в котором должен выполняться сдвиг после каждого чтения и сдвиг — после достижения границы памяти, которая выделена для очереди. Приоритет: минимальное значение числового параметра, при совпадении параметров — LIFO.
Пишите свое решение в комментариях👇
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
«Посмотри-и-скажи» — это последовательность чисел, начинающаяся следующим образом:
1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211,… (последовательность A005150 в OEIS).
Каждое последующее число генерируется из предыдущего путём конкатенации цифры, из которой состоит группа одинаковых цифр и количества цифр в этой группе, для каждой группы одинаковых цифр в числе.
Решим задачу с leetcode: https://leetcode.com/problems/count-and-say
Пример1:
Input: n = 1
Output: '1'
Пример2:
Input: n = 4
Output: '1211'
Explanation:
countAndSay(1) = '1'
countAndSay(2) = say '1' = one 1 = '11'
countAndSay(3) = say '11' = two 1's = '21'
countAndSay(4) = say '21' = one 2 + one 1 = '12' + '11' = '1211'
Ограничения:
- 1 <= n <= 30
Решение:
func countAndSay(n int) string {
dp := make([]string, n + 1)
dp[1] = '1'
var current, next string
counter := 1
for i := 2; i <= n; i++ {
current = dp[i - 1]
next = ''
counter = 1
for j := 1; j < len(current); j++ {
if current[j - 1] == current[j] {
counter++
} else {
next += strconv.Itoa(counter) + string(current[j - 1])
counter = 1
}
}
next += strconv.Itoa(counter) + current[len(current) - 1:]
dp[i] = next
}
return dp[n]
}
👉 Пишите свое решение в комментариях👇
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🌀 Заполнение матрицы по спирали
Эта классическая задача часто встречается на собеседованиях и олимпиадах. Рассмотрим несколько способов решения на Python.
На вход программе подаются два натуральных числа n и m. Напишите программу, которая создает матрицу размером n х m, заполнив ее по спирали числами от 1 до n x m. Спираль начинается в левом верхнем углу и закручивается по часовой стрелке.
Пример ввода:
Пример вывода:
👉 Пишите свое решение в комментариях👇
@golang_interview
Эта классическая задача часто встречается на собеседованиях и олимпиадах. Рассмотрим несколько способов решения на Python.
На вход программе подаются два натуральных числа n и m. Напишите программу, которая создает матрицу размером n х m, заполнив ее по спирали числами от 1 до n x m. Спираль начинается в левом верхнем углу и закручивается по часовой стрелке.
Пример ввода:
7 6
Пример вывода:
1 2 3 4 5 6
22 23 24 25 26 7
21 36 37 38 27 8
20 35 42 39 28 9
19 34 41 40 29 10
18 33 32 31 30 11
17 16 15 14 13 12
👉 Пишите свое решение в комментариях👇
@golang_interview
Описание задачи
Разработать микросервис для работы с балансом пользователей (баланс, зачисление/списание/перевод средств).
Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON. Дополнительно реализовать методы конвертации баланса и получение списка транзакций. Полное описание в TASK.
Реализация
▪Следование дизайну REST API.
▪Подход "Чистой Архитектуры" и техника внедрения зависимости.
▪Работа с фреймворком gin-gonic/gin.
▪Работа с СУБД Postgres с использованием библиотеки sqlx и написанием SQL запросов.
▪Конфигурация приложения - библиотека viper.
▪Запуск из Docker.
▪Unit/Интеграционное - тестирование уровней обработчикоов, бизнес-логики и взаимодействия с БД с помощью моков - библиотеки testify, mock.
📌 Github
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Необходимо реализовать сервис на Golang для генерации случайных значений.
Сервис реализует JSON API работающее по HTTP. Каждой генерации присваивать уникальный id, по которому можно получить результат генерации методом retrieve.
Реализовать методы
POST /api/generate/ - генерация случайного значения и его идентификатора
GET /api/retrieve/ - получение зачения по id, которое вернулось в методе generate
Задача может быть решена со следующими усложнениями
возможность задать входные параметры для метода /api/generate/
type - тип возвращаемого случайного значения (строка, число, guid, цифробуквенное, из заданных значений)
длина возвращаемого значения
возможность идемпотентных запросов (несколько запросов с одним requestId вернут то же самое число)
сервис поставляется как Docker образ, опубликованный в публичном репозитории
написать Unit тесты
Способы запуска сервиса
Тестовый запуск http-сервера с помощью CLI
go run cmd/avitornd/avitornd.go
Запуск через Docker-образ
docker build -t avitornd:local -f deployments/docker/avitornd-prod.Dockerfile .
docker run -p 8888:8888 avitornd:local
Запуск из публичного репозитория DockerHubdocker run -p 8888:8888 maintianone/avitornd:latest
Документация к RESTful API
Документация написана по стандарту OASv3 и расположена в директории
api/openapi-spec
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Тестовое задание для Go-разработчика — Разработка API
Описание задачи
Необходимо написать простейшее API для каталога товаров. Приложение должно содержать:
▪Категории товаров
▪Конкретные товары, которые принадлежат к какой-то категории (один товар может принадлежать нескольким категориям)
▪Пользователей, которые могут авторизоваться
Возможные действия:
▪Получение списка всех категорий
▪Получение списка товаров в конкретной категории
▪Авторизация пользователей
▪Добавление/Редактирование/Удаление категории (для авторизованных пользователей)
▪Добавление/Редактирование/Удаление товара (для авторизованных пользователей)
Технические требования
▪Приложение должно быть написано на Golang
▪Приложение не должно быть написано с помощью какого-либо фреймворка, однако можно устанавливать для него различные пакеты
▪Результаты запросов должны быть представлены в формате JSON
▪Результат задания должен быть выложен на github, должна быть инструкция по запуску проекта. Также необходимо пояснить, сколько на каждую часть проекта ушло времени
Критерии оценки
▪Архитектурная организация API
▪Корректная обработка внештатных ситуаций
▪Покрытие кода тестами
@golang_interview
Описание задачи
Необходимо написать простейшее API для каталога товаров. Приложение должно содержать:
▪Категории товаров
▪Конкретные товары, которые принадлежат к какой-то категории (один товар может принадлежать нескольким категориям)
▪Пользователей, которые могут авторизоваться
Возможные действия:
▪Получение списка всех категорий
▪Получение списка товаров в конкретной категории
▪Авторизация пользователей
▪Добавление/Редактирование/Удаление категории (для авторизованных пользователей)
▪Добавление/Редактирование/Удаление товара (для авторизованных пользователей)
Технические требования
▪Приложение должно быть написано на Golang
▪Приложение не должно быть написано с помощью какого-либо фреймворка, однако можно устанавливать для него различные пакеты
▪Результаты запросов должны быть представлены в формате JSON
▪Результат задания должен быть выложен на github, должна быть инструкция по запуску проекта. Также необходимо пояснить, сколько на каждую часть проекта ушло времени
Критерии оценки
▪Архитектурная организация API
▪Корректная обработка внештатных ситуаций
▪Покрытие кода тестами
@golang_interview
Даны два числа. Определить цифры, входящие в запись как первого, так и второго числа. Программа получает на вход два числа.
Гарантируется, что цифры в числах не повторяются. Числа в пределах от 0 до 10000. Программа должна вывести цифры, которые имеются в обоих числах, через пробел. Цифры выводятся в порядке их нахождения в первом числе.
Пример: Ввод: 564 8954 Вывод: 5 4
package main
import "fmt"
func main(){
var a, b, x , y int
fmt.Scan(&a, &b)
j:=10000
for a > 0{
x = a / j
a = a % j
y = b
for y > 0 && x > 0{
if y%10 == x {
fmt.Print(x, " ")
}
y = y/10
}
j = j/10
}
}
Вариант2
package main
import "fmt"
import "strconv"
func main() {
var (
sum string
a, b int
)
for true {
fmt.Println("Enter two nums 0 <= num <= 10000")
fmt.Scan(&a, &b)
if a < 0 || a > 10000 || b < 0 || b > 10000 {
fmt.Println("Enter correct nums")
continue
} else {
break
}
}
for _, n := range strconv.Itoa(a) {
for _, k := range strconv.Itoa(b) {
if n == k {
sum += string(n) + " "
}
}
}
fmt.Println(sum)
}
👉 Пишите свое решение в комментариях👇
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Mock-собеседование Go разработчика из OZON | Самое полное интервью
Курсы по программированию: https://clck.ru/37iG2b
Потренироваться проходить собеседования: https://clck.ru/3C2CY3
Консультации:
https://getmentor.dev/mentor/vladimir-balun-191
https://solvery.io/ru/mentor/vladimir_balun
Таймкоды:
00:00 - Введение
00:11…
Потренироваться проходить собеседования: https://clck.ru/3C2CY3
Консультации:
https://getmentor.dev/mentor/vladimir-balun-191
https://solvery.io/ru/mentor/vladimir_balun
Таймкоды:
00:00 - Введение
00:11…
Частью этого отбора (кроме HR-параметров в резюме) было прохождение заданий на https://contest.yandex.ru/. Мы рассмотрим задачи, которые предлагалось решить.
▪Смотреть
▪Github
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача leetcode. Sum of Subarray Minimums
Сложность: Средняя
Задача: Дан массив целых чисел, необходимо посчитать сумму минимумов подмассивов, ответ может быть большим, необходимо посчитать результат по модулю
Пример:
Ввод:
Вывод:
Примечание:
Подмассивы:
Решение:
Пишите свое решение в комментариях👇
Сложность: Средняя
Задача: Дан массив целых чисел, необходимо посчитать сумму минимумов подмассивов, ответ может быть большим, необходимо посчитать результат по модулю
10^9 + 7.
Пример:
Ввод:
arr = [3,1,2,4]
Вывод:
17
Примечание:
Подмассивы:
[3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4],
[3,1,2,4], минимумы этих подмассивов: 3, 1, 2, 4, 1, 1, 2, 1, 1, 1,
которые в сумме дают 17.Решение:
func sumSubarrayMins(arr []int) int {
out := 0
var st stack
st.push(-1) // setting left bound
for i := range arr {
for len(st) > 1 && arr[i] <= arr[st.peak()] {
idx := st.pop()
out += (i - idx) * (idx - st.peak()) * arr[idx]
}
st = append(st, i)
}
for len(st) > 1 {
idx := st.pop()
out += (len(arr) - idx) * (idx - st.peak()) * arr[idx]
}
return out % 1000000007
}
type stack []int
func (s *stack) push(v int) {
*s = append(*s, v)
}
func (s *stack) pop() int {
v := (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
return v
}
func (s *stack) empty() bool {
return len(*s) == 0
}
func (s *stack) peak() int {
v := (*s)[len(*s)-1]
return v
}
Пишите свое решение в комментариях👇
@golang_interviewВсем привет! ✨
Команда SberMarket Tech ищет Golang разработчика, которому предстоит развивать новое направление - привлечение большего количества клиентов на витрины СберМаркета за счет органического трафика из поисковиков. Для этого будем разрабатывать и продвигать инструменты SEO, простраивать входную точку нашего каталога, чтобы клиенту было проще найти необходимое!
Чем будем заниматься:
- разрабатывать инструменты для настройки SEO на базе существующих сервисов (Go), а также монолита (Ruby);
- проектировать и реализовывать микросервисы;
- улучшать производительность работы микросервисов и находить оптимальные решения;
- разбирать баги, инциденты и устранять их последствия;
- прорабатывать масштабируемую архитектуру базы данных и микросервисов.
Мы рассчитываем, что ты:
- имеешь опыт коммерческой разработки на Go от 2 лет;
- проектировал высоконагруженные системы;
- работал с PostgreSQL/MySQL, Redis, Kafka;
- знаком с Unix, Git, понимаешь принципы CI/CD;
- работал с Docker-контейнерами, Istio и Kubernetes;
- хочешь участвовать в жизни продукта и командной работе;
- будет плюсом, если есть опыт в Ruby/Rails.
Что предлагаем:
- ДМС с первого месяца работы в компании;
- соцпакет на выбор — спорт, промокоды на заказ продуктов или билеты в отпуск;
- работаем удаленно. В Москве есть большой и красивый офис, поэтому если ты из этого города или будешь проездом — welcome;
- предоставляем технику для работы на твой выбор;
- помогаем интеллектуально и физически развиваться (электронная библиотека, книжный клуб, футбол);
- уделяем большое внимание обучению сотрудников, поэтому в нашей knowledge base ты найдёшь много интересных курсов, книг и записей конференций, а также у нас есть выделенный бюджет на образование.
А ещё:
- мы сами участвуем в конференциях, как спикеры;
- проводим внутренние митапы;
- не боимся экспериментировать с новыми решениями и технологиями;
- заботимся о сотрудниках: в компании есть специалист по здоровью и психологи для разговоров по душам 🙂
За всеми подробностями приходите в личку! Telegram HR: @Chernenko_Maria
Команда SberMarket Tech ищет Golang разработчика, которому предстоит развивать новое направление - привлечение большего количества клиентов на витрины СберМаркета за счет органического трафика из поисковиков. Для этого будем разрабатывать и продвигать инструменты SEO, простраивать входную точку нашего каталога, чтобы клиенту было проще найти необходимое!
Чем будем заниматься:
- разрабатывать инструменты для настройки SEO на базе существующих сервисов (Go), а также монолита (Ruby);
- проектировать и реализовывать микросервисы;
- улучшать производительность работы микросервисов и находить оптимальные решения;
- разбирать баги, инциденты и устранять их последствия;
- прорабатывать масштабируемую архитектуру базы данных и микросервисов.
Мы рассчитываем, что ты:
- имеешь опыт коммерческой разработки на Go от 2 лет;
- проектировал высоконагруженные системы;
- работал с PostgreSQL/MySQL, Redis, Kafka;
- знаком с Unix, Git, понимаешь принципы CI/CD;
- работал с Docker-контейнерами, Istio и Kubernetes;
- хочешь участвовать в жизни продукта и командной работе;
- будет плюсом, если есть опыт в Ruby/Rails.
Что предлагаем:
- ДМС с первого месяца работы в компании;
- соцпакет на выбор — спорт, промокоды на заказ продуктов или билеты в отпуск;
- работаем удаленно. В Москве есть большой и красивый офис, поэтому если ты из этого города или будешь проездом — welcome;
- предоставляем технику для работы на твой выбор;
- помогаем интеллектуально и физически развиваться (электронная библиотека, книжный клуб, футбол);
- уделяем большое внимание обучению сотрудников, поэтому в нашей knowledge base ты найдёшь много интересных курсов, книг и записей конференций, а также у нас есть выделенный бюджет на образование.
А ещё:
- мы сами участвуем в конференциях, как спикеры;
- проводим внутренние митапы;
- не боимся экспериментировать с новыми решениями и технологиями;
- заботимся о сотрудниках: в компании есть специалист по здоровью и психологи для разговоров по душам 🙂
За всеми подробностями приходите в личку! Telegram HR: @Chernenko_Maria
Реализовать микросервис для работы с балансом пользователей (зачисление средств, списание средств, перевод средств от пользователя к пользователю, а также метод получения баланса пользователя).
Сервис должен предоставлять
HTTP API
и принимать/отдавать запросы/ответы в формате JSON
.Инструкция по запуску
▪Клонировать репозиторий локально в любую деректорию своего устройства
git clone https://github.com/Owner-maker/microservice-for-working-with-user-balance.git
▪Перейти в директорию проекта вручную или с помощью консоли
cd microservice-for-working-with-user-balance
▪Создать и запустить Docker - контейнер docker-compose build && docker-compose up
▪После запуска контейнера все сущности автоматически будут созданы в базе данных
▪Также будут автоматически добавлены 2 тестовых пользователя с отсутствующими балансами
Их id = 1 и id = 2 соответственно
▪После запуска контейнера будет также доступна html - страница Swagger для удобства тестирования API
http://localhost:8080/swagger/index.html#/
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача с Leetcode. Поиск в двумерной матрице
Сложность: Средняя
Условие задачи: напишите эффективный алгоритм для поиска наличия нужного числа в двумерной матрице, которая имеет следующие свойства:
▪ в строке элементы отсортированы по возрастанию (слева - направо);
▪ в столбце элементы отсортированы по возрастанию (снизу - вверх).
Пример:
Ввод:
Вывод:
Решение:
Временная сложность:
Пространственная сложность:
Пишите свое решение в комментариях👇
@golang_interview
Сложность: Средняя
Условие задачи: напишите эффективный алгоритм для поиска наличия нужного числа в двумерной матрице, которая имеет следующие свойства:
▪ в строке элементы отсортированы по возрастанию (слева - направо);
▪ в столбце элементы отсортированы по возрастанию (снизу - вверх).
Пример:
Ввод:
matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Вывод:
true
Решение:
func searchMatrix(matrix [][]int, target int) bool {
m, n := len(matrix), len(matrix[0])
i, j := 0, n-1
for i < m && j >= 0 {
if matrix[i][j] == target {
return true
}
if matrix[i][j] < target {
i++
} else {
j--
}
}
return false
}
Временная сложность:
O(m + n)
Пространственная сложность:
O(1)
Пишите свое решение в комментариях👇
@golang_interview