Проходим собеседование на GoLang - разработчика
  • Введение
  • Общие вопросы
  • ✏️Шпаргалка по синтаксису GoLang
  • 📖GoLang теория
    • Типы данных
    • Строки
    • Массивы и слайсы
    • Мапы
    • Каналы
    • Goрутины
    • Гонка данных
    • Мьютексы
    • Контекст
    • ООП, интерфейсы
    • Другие вопросы по Go
  • 🚲GoLang Задачи
    • Задачи на строки
    • Задачи на слайсы
    • Задачи на мапы
    • Задачи на указатель
    • HTTP-запросы
    • Задачи про каналы
    • Задачи на интерфесы
    • Задачи на горутины
    • Задачи с БД
    • Задачи на defer
    • Задачи на таймер
    • Задачи на рефакторинг
    • Нерассортированные задачи
  • 🏬Базы данных
    • 🥥SQL (язык запросов)
    • 🍩Индексы
    • 🥞Транзакции
    • ✈️Масштабирование
  • 🚆Протоколы HTTP/UDP/TCP и т.д.
  • 🛞Алгоритмы
  • 🖥️Операционные системы
  • 🚢Сисдиз
  • 🤪Управление командой
Powered by GitBook
On this page
  1. GoLang Задачи

Задачи на мапы

1) Написать метод, на вход которого приходит список слов, на выходе нужно вернуть список слов с подсписками, где каждый подсписок содержит слова - анаграммы (одинаковые слова с учетом перестановки символов).

Давайте напишем метод на Go, который принимает список слов и возвращает список подсписков, где каждый подсписок содержит слова-анаграммы.

Пояснение решения

  1. Сортировка символов:

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

    • Например, для слова "listen" отсортированные символы будут "eilnst", и для слова "silent" отсортированные символы также будут "eilnst".

  2. Использование карты (map):

    • Мы будем использовать карту (map), где ключом будет отсортированное слово, а значением — список слов, которые являются анаграммами этого ключа.

    • Например, для ключа "eilnst" значением будет список ["listen", "silent"].

  3. Формирование результата:

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

Код

package main

import (
	"fmt"
	"sort"
	"strings"
)

// Функция для сортировки символов в строке
func sortString(s string) string {
	runes := []rune(s)
	sort.Slice(runes, func(i, j int) bool {
		return runes[i] < runes[j]
	})
	return string(runes)
}

// Функция для группировки анаграмм
func groupAnagrams(words []string) [][]string {
	anagramMap := make(map[string][]string)

	for _, word := range words {
		sortedWord := sortString(word)
		anagramMap[sortedWord] = append(anagramMap[sortedWord], word)
	}

	var result [][]string
	for _, anagrams := range anagramMap {
		result = append(result, anagrams)
	}

	return result
}

func main() {
	words := []string{"listen", "silent", "enlist", "inlets", "google", "gogole", "cat", "act", "tac"}
	anagramGroups := groupAnagrams(words)

	for _, group := range anagramGroups {
		fmt.Println(strings.Join(group, ", "))
	}
}

Объяснение кода

  1. Функция sortString:

    • Принимает строку, преобразует ее в срез рун ([]rune), сортирует руны и возвращает отсортированную строку.

    • Это позволяет нам получить каноническую форму слова, которую можно использовать в качестве ключа в карте.

  2. Функция groupAnagrams:

    • Принимает список слов и создает карту anagramMap, где ключом является отсортированное слово, а значением — список слов, которые являются анаграммами этого ключа.

    • Для каждого слова в списке:

      • Сортирует символы слова.

      • Добавляет слово в соответствующий список в карте.

    • После заполнения карты преобразует значения карты в список подсписков и возвращает его.

  3. Функция main:

    • Пример использования функции groupAnagrams.

    • Выводит группы анаграмм на экран.

Заключение

Этот метод эффективно группирует слова-анаграммы, используя сортировку символов и карту для хранения и поиска групп анаграмм. Это решение масштабируется и работает быстро даже для больших списков слов.

PreviousЗадачи на слайсыNextЗадачи на указатель

Last updated 11 months ago

🚲