Тестовая задачка на C#
Найти индекс первого уникального чара. Желательно быстрее чем O(n2). Шаблон: https://onlinegdb.com/7TNwoh1vy
можете перейти, но сначала проверьте ссылку и будьте аккуратны: не вводите по ссылке пароли, номера телефонов и банковских карт, и другие личные данные
https://
уверены, что хотите выйти?
придется авторизоваться заново, а заполненные данные будут удалены
пост закреплён — пока закрепить можно только один пост
что-то пошло не так — попробуйте снова чуть попозже
· 21.07.2024
взять хеш мап, да положить туда пару - индекс когда символ встретился первый раз и сколько он раз встретился. Прошлись по строке и заполнили хеш-мап, потом в хеш-мап нашли элемент с минимальным индексом и количество 1. :)
если хеш-мап использовать не хочется и известно, что строка содержит только латинские символы в нижнем регистре, то можно использовать два 32 битных целых. Вначале идем по строке от начала к концу и выставляем в бит соответствующий номеру символа, если он уже был выставлен, то выставляем в 1 бит во втором числе. Дойдя до конца делаем побитовый xor. Если результат 0, то уникальных символов нет, если нет, то читаем строку от конца к началу и выставляем соответствующий бит в результате xor в ноль. Как только результат превратится в ноль, то был найден первый уникальный символ, а соответсвенно и его индекс. Если словарь символов больше 32, то можно взять для хранения битов несколько целых.
Или вариант второго алгоритма - после xor снова идем по строке с начала и смотрим выставлен ли соответствующий бит в результате xor - если да, то первый уникальный найден символ найден.
Если словарь символов очень большой, то предпочтительнее вариант с хеш-мапой.
Оба варианта имеют линейную сложность.
А можно и еще вариант - использовать хеш-мап и двусвязный список. В хеш-мапе ключ - символ и указатель на элемент списка (аналог его в c#), в списке хранится индекс. При прохождении строки смотрим есть ли элемент в мапе, если нет, то добавляем индекс элемента в конец списка и добавляем значение в мапу. Если уже есть, то удалем элемент из списка (если не был удален) и в мапе обнуляем значение - это будет признак, что элемент встречается больше одного раза. В итоге, если список пуст, то нет уникальных значений, а если нет, то первый элемент в нем - это индекс первого уникального элемента.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 22.07.2024
заполнение хэша это линейная операция?
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 22.07.2024
на счет варианта с линк листом, я возможно не совсем понял, но как вы справитесь с чарами встречающимися нечетное количество раз?
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 22.07.2024
фундаментально вы правы - надо подсчитать количество каждого встречающегося чара и потом найти первый из них.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 22.07.2024
На доступ/вставку/обновление O(1) апроксимированное, так что и заполнение получится аппроксимированно линейным
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 22.07.2024
при третьей и последующих встречах символа в хеш мапе будет хранится запись для элемента, но значение в хешмапе - указатель на список будет нулевым или можно использовать тип Optional/Maybe. Так что в этом случае ничего ни с хешмапой, ни со списком делать не надо будет.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён