Как да преместите прозореца в алгоритъма за плъзгащ прозорец?
Golang
// За два масива от цели числа с дължина N, // за всички K от 1 до N, изчислете броя на общите числа в префиксите с дължина K. // Числата в масива могат да се повтарят, пресечението се счита без да се вземат предвид кратностите. // Префикс с дължина K на масива A е първите K елемента на масива A // A [1, 1] => [1], [1, 1] // B [1, 1] => [1], [1, 1] // R [1, 1] // [1, 2, 5] => [1], [1, 2], [1, 2, 5] // [1, 5, 4] => [1], [1, 5], [1, 5, 4] // [1, 1, 2]
Как работи WebSocket връзката в архитектурата — в кой момент се установява и кой с кого комуникира?
// Дадени са две сортирани последователности от цели числа. // Необходимо е да върнете всички елементи от първата последователност, които не са във втората. // 0 <= N <= 10^6 // -10^9 <= a[i] <= 10^9 // [1] // [2, 3, 4, 5, 6] // [1] // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...] // [1] // [2, 3, 4, 5, 6, 7, 8] func filter(first []int, second []int) []int { res := make([]int, 0, len(first)) i, j := 0, 0 for i < len(first) && j < len(second) { if first[i] < second[j] { result = append(result, first[i]) i++ } else if first[i] > second[j] { j++ } else { i++ j++ } } for i < len(first) { result = append(result, first[i]) i++ } return result }
Разкажете за най-трудната и интересна задача, която сте решавали, особено за архитектурния опит.
Какъв е проблемът с текущата реализация на актуализацията на картата в работника (tasksRes[t.id][task{...}])?
Дадена е функция, която приема две сортирани по неубиване последователности от цели числа. Трябва да върнете всички елементи от първата последователност, които ги няма във втората. Как бихте подходили към решението и каква е сложността?
Можете ли да посочите текущото си ниво на доходи?
В момента живееш в Москва? Кой град разглеждаш? Обмисляш ли хибриден формат на работа? На какъв етап от търсенето си?
Имате ли други активни процеси за интервюта?
Как се интегрират и показват тези метрики в Grafana?
Проектирайте мащабируема система за съобщения, която поддържа 150 милиона потребители, 75 милиона DAU, 225 милиона MAU, 1.2M четения / 300k писания QPS, 5 милиона едновременни потребители, 60 PB нови данни годишно, растеж от 30% годишно, P99 <200 ms за четене, <300 ms за писане, SLA 99.95%. КОНТЕКСТ Необходимо е да проектирате разпределена система за съобщения, подобна на WhatsApp, която поддържа 1:1 и групови чатове, осигурява доставка на съобщения, показва онлайн статусите на потребителите и предава мултимедийни файлове (снимки, видеа, аудио). Системата трябва да осигурява висока наличност и ниска латентност, да поддържа висок паралелизъм и да се мащабира глобално. ФУНКЦИОНАЛНИ ИЗИСКВАНИЯ - Поддръжка на лични (1:1) и групови чатове с възможност за добавяне/премахване на участници - Изпращане и получаване на текстови съобщения и мултимедийни файлове Нефункционални изисквания: - Няма явна реализация на механизъм за end-to-end криптиране на ниво услуги или клиенти, освен обща бележка. - Липсва ясно описание на sharding и репликация на бази данни по chat_id или user_id за мащабируемост и отказоустойчивост. - Няма явен компонент или механизъм за офлайн синхронизация на съобщения и потвърждения за доставка. - Не е ясно как се извършва балансировката на натоварването между базите данни и услугите, особено при пикови натоварвания. **Критични точки за внимание:** (Диаграмата показва архитектура с Load Balancer, API Gateway, Message Queue, Service, Cache, Database, Object Storage и CDN.)
Имаш ли активен GitHub или LinkedIn?
Какъв беше съставът на екипа, с който работихте последния път?
[име] посочи несъответствие в оценката на паметта: заяви едно, написа друго. Как правилно да оценим паметта?
Разкажи ми за последния си проект — какво представлява и с какво точно се занимаваш?
Разкажи накратко с какво си се занимавал на предишните си работни места и какви функции си реализирал.
Имали ли сте опит с разпределени системи?
Проектиране на мащабируема система за съобщения, която поддържа 150 милиона потребители, 75 милиона DAU, 225 милиона MAU, 1,2 милиона peak QPS за четене / 300k за писане, 5 милиона едновременни потребители, 60 PB нови данни годишно, 30% годишен растеж, SLA 99,95%, p99 <200 ms за четене, <300 ms за писане. КОНТЕКСТ Необходимо е да се проектира разпределена система за съобщения, подобна на WhatsApp, която поддържа 1:1 и групови чатове, осигурява доставка на съобщения, показва онлайн статусите на потребителите и позволява пренос на мултимедийни файлове (снимки, видеа, аудио). Системата трябва да осигурява висока наличност и ниска латентност, да поддържа висок паралелизъм и да се мащабира глобално. ФУНКЦИОНАЛНИ ИЗИСКВАНИЯ - Поддръжка на лични (1:1) и групови чатове с възможност за добавяне/премахване на участници - Изпращане и получаване на текстови съобщения и мултимедийни файлове Не се вижда ясна реализация на механизъм за end-to-end криптиране на ниво услуги или клиенти, освен обща бележка. - Липсва ясно описание на sharding и репликация на бази данни по chat_id или user_id за мащабируемост и отказоустойчивост. - Няма ясен компонент или механизъм за офлайн синхронизация на съобщения и потвърждения за доставка. - Не е ясно как се извършва балансът на натоварването между базите данни и услугите, особено при пикови натоварвания. **Критични точки за разглеждане:**
/* Има два сървъра PostgreSQL: * PROD - OLTP сървър, * STATS - сървър за дълги аналитични заявки. На текущия сървър, в базата данни prod, има голяма таблица (10Tb) със следната структура: CREATE TABLE profiles( id SERIAL, data JSONB ) В таблицата могат да има "дупки", т.е. някои `id` могат да липсват. Трябва да напишете програма за копиране на таблицата profiles от PROD към STATS. Предполага се, че ще се използват следните интерфейси за работа с базите данни: type Row []interface{} type Database interface { // реализацията на интерфейса Database може да възстанови връзките // извикването на SaveRows е идемпотентно io.Closer GetMaxID(ctx context.Context) (uint64, error) LoadRows(ctx context.Context, minID, maxID uint64) ([]Row, error) // [minID, maxID] SaveRows(ctx context.Context, rows []Row) error } func Connect(ctx context.Context, dbname string) (Database, error) // CopyTable // Ако full=false, продължете прехвърлянето на данни от мястото на предишната грешка // Ако full=true, прехвърлете всички данни func CopyTable(fromName string, toName string, full bool) error { // ... вашият код } Ако е зададена опцията `full=false`, програмата трябва да продължи прехвърлянето на данни от мястото на предишната грешка. Ако `full=true`, трябва да прехвърли всички данни. **Основно ниво**: - последователен пренос на данни в един поток - възстановяване след грешка (опция `full=false`) Допълнителна информация: - ако е необходимо, можете да разширите интерфейса, като добавите свои методи - ако е необходимо, можете да използвате директно пакета **database/sql**