Йо, меня зовут Наби. Заранее благодарю за чтение и желаю продуктивно провести время! Если после прочтения возникнут вопросы, пожелания или предложения, то буду рад ознакомиться со всем в комментариях!
Предисловие:
В предыдущей части мы решали математическую задачу про вычисление углового коэффициента прямой, получали определенные значения из массива с каким-то условием, научились определять является ли текст изограммой, столкнулись с задачей по поиску определенных слов в предложении ну и конечно же решили интересную задачу про принтер на фабрике . В этой части вас ждут еще более интересные алгоритмические задачи!
Перед началом чтения решения задачи, хочу призвать каждого к самостоятельному решению задачи, чтобы после вы могли сравнить своё решение с моим и обсудить это в комментариях. Буду рад послушать ваше мнение! Давайте, приступим!
Новое в конфигурации Algo1C (Последние 5 версий):
Актуальную версию конфигурации вы можете загрузить здесь (Нажмите на строку)
- 0.5 : Добавлена возможность выбирать контекст исполнения кода, например: НаСервере или НаКлиенте
- 0.4 : Исправлена ошибка при выводе содержимого исключения
- 0.3 : Добавлена возможность сохранять и загружать задачи; Внесены небольшие изменения в интерфейс
- 0.2 : Исправлена ошибка при выводе результата (Отдельная благодарность SAShikutkin)
Решение задач:
Платформа: Codewars
Название задачи: Find the unique number
Ссылка на задачу: https://www.codewars.com/kata/585d7d5adb20cf33cb000235 (Нажмите на строку)
Сложность: 6 kyu
Тэги: Фундаментальные, Алгоритмы, Массивы
Оригинальное описание задачи:
There is an array with some numbers. All numbers are equal except for one. Try to find it!
find_uniq([ 1, 1, 1, 2, 1, 1 ]) == 2 find_uniq([ 0, 0, 0.55, 0, 0 ]) == 0.55
It’s guaranteed that array contains at least 3 numbers.
The tests contain some very huge arrays, so think about performance.
Пояснение:
Суть задачи максимально проста и заключается она в том чтобы найти единственное уникальное число из данного нам массива. Условия задачи подразумевают что могут быть даны действительно тяжелые массива, поэтому рекомендуют нам позаботиться о производительности!
Решение:
Первое что приходит на ум так это просто перебрать все элементы массива и затем в каждой итерации считать количество элементов но у Массивов в 1С нет встроенного метода подсчета вхождений. Будет лучше придумать другой вариант. Например можно воспользоваться Таблицей Значений, у которой есть метод "НайтиСтроки", который вернет список найденных значений. Но для того чтобы не менять условия задачи, давайте исходные данные оставим как массив, заполним его и уже будем все переносить в Таблицу Значений! Приступим?
ИсходныйМассив = Новый Массив;
Для НомерСтроки = 1 По 10000 Цикл
ИсходныйМассив.Добавить(НомерСтроки);
Если ?(НомерСтроки%10 = 0,Истина,Ложь) Тогда
ИсходныйМассив.Добавить(5);
КонецЕсли;
КонецЦикла;
//
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ЗначениеМассива");
Для Каждого Стр Из ИсходныйМассив Цикл
НС = ТЗ.Добавить();
НС.ЗначениеМассива = Стр;
КонецЦикла;
//
ПроверенныеЗначения = Новый Массив;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ЗначениеМассива",Неопределено);
//
Для Каждого Стр Из ИсходныйМассив Цикл
Если ПроверенныеЗначения.Найти(Стр) = Неопределено Тогда
ПараметрыОтбора.ЗначениеМассива = Стр;
Если ТЗ.НайтиСтроки(ПараметрыОтбора).Количество() > 1 Тогда
Вывод = Стр;
Иначе
ПроверенныеЗначения.Добавить(Стр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Заключение:
Интересная задача, на самом деле. Я думаю есть еще более быстрое решение ибо если входной массив будет еще больше, обработка может затянуться. Предлагайте свои решения!
Заключение:
Ну что ж, пока на этом всё, надеюсь статья была увлекательной для вас, благодарю за внимание. Подключайтесь к решению алгоритмических задач вместе со мной, делитесь вашим мнением и решениями в комментариях! Увидимся в новой статье!