Йо, меня зовут Наби. Заранее благодарю за чтение и желаю продуктивно провести время! Если после прочтения возникнут вопросы, пожелания или предложения, то буду рад ознакомиться со всем в комментариях!
Предисловие:
В предыдущей части мы решали математическую задачу про вычисление углового коэффициента прямой, получали определенные значения из массива с каким-то условием, научились определять является ли текст изограммой, столкнулись с задачей по поиску определенных слов в предложении ну и конечно же решили интересную задачу про принтер на фабрике . В этой части вас ждут еще более интересные алгоритмические задачи!
Перед началом чтения решения задачи, хочу призвать каждого к самостоятельному решению задачи, чтобы после вы могли сравнить своё решение с моим и обсудить это в комментариях. Буду рад послушать ваше мнение! Давайте, приступим!
Новое в конфигурации Algo1C (Последние 5 версий):
Актуальную версию конфигурации вы можете загрузить здесь (Нажмите на строку)
- 0.5 : Добавлена возможность выбирать контекст исполнения кода, например: НаСервере или НаКлиенте
- 0.4 : Исправлена ошибка при выводе содержимого исключения
- 0.3 : Добавлена возможность сохранять и загружать задачи; Внесены небольшие изменения в интерфейс
- 0.2 : Исправлена ошибка при выводе результата (Отдельная благодарность SAShikutkin)
Решение задач:
Задача 1
Платформа: 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 Тогда
Вывод = Стр;
Иначе
ПроверенныеЗначения.Добавить(Стр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Заключение:
Интересная задача, на самом деле. Я думаю есть еще более быстрое решение ибо если входной массив будет еще больше, обработка может затянуться. Предлагайте свои решения!
Задача 2
Задача 3
Задача 4
Задача 5
Заключение:
Платформа: 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 Тогда
Вывод = Стр;
Иначе
ПроверенныеЗначения.Добавить(Стр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Заключение:
Интересная задача, на самом деле. Я думаю есть еще более быстрое решение ибо если входной массив будет еще больше, обработка может затянуться. Предлагайте свои решения!
Ну что ж, пока на этом всё, надеюсь статья была увлекательной для вас, благодарю за внимание. Подключайтесь к решению алгоритмических задач вместе со мной, делитесь вашим мнением и решениями в комментариях! Увидимся в новой статье!