Как научиться решать задачи в java теория
Перейти к содержимому

Как научиться решать задачи в java теория

  • автор:

Задания

Добро пожаловать в раздел «Практические задачи по программированию Java»! Здесь вы найдете набор интересных задач, созданных специально для тех, кто только начинает свой путь в мире Java.

�� Бесплатно для всех уровней! ��

Почему стоит приступить к решению задач:

  1. Научитесь применять теоретические знания на практике: Задачи разработаны так, чтобы закрепить ваши знания и помочь лучше понять основы языка программирования Java.
  2. Развитие навыков алгоритмизации: Решая задачи, вы тренируете свой ум в разработке эффективных алгоритмов, что важно для успешного программирования.
  3. Подготовка к реальным проектам: Решение практических задач поможет вам освоить те навыки, которые пригодятся в реальных проектах и задачах.

Примите вызов и углубитесь в мир Java-программирования, решая увлекательные задачи! Помните, что учиться программированию можно не только из теории, но и из реальных практических задач.

Задания по теме «Создание первого приложения на Java», компиляция и запуск программы из командной строки. Создание jar файла. Аргументы командной строки.

Задания по теме Лексика языка Java — литералы, приведение типов, практика класса Scanner, практика написания методов.

Задания по теме операции в языке Java — арифметические, побитовые, логические операции, тернарный оператор, среднее значение чисел, меньшее по модулю число.

Задачи на циклы while, do-while, if else, for и операторы перехода языка Java. Для успешного написания задач рекомендуется изучить урок «Операторы языка Java».

Массивы — задачи для реализации на языке Java. Для успешного написания задач рекомендуется изучить урок «Массивы».

Задачи по теме Алгоритмы Java. Работа с алгоритмом сортировки пузырьком и выбором. Для успешного написания задач рекомендуется изучить урок.

Задачи по теме Объектно-Ориентированное программирование (ООП) по курсу Java Программирование. Перед выполнением задач желательно просмотреть лекции темы.

Задания по теме ключевое слово static в языке Java. Как посчитать количество объектов класса. Перед выполнением заданий желательно просмотреть лекции по теме.

Задачи по темам интерфейсы, преобразование ссылочных типов, перечисления в языке Java.

Задания по теме использование классов оболочек в языке Java. Перед выполнением заданий рекомендуется просмотреть урок.

Задачи на тему строки, классы String, StringBuilder, StringBuffer, форматирование строк, регулярные выражения в языке программирования Java.

Задания по теме Локализация и интернационализация, классы ResourceBundle и NumberFormat в языке Java. Для успешного написания задач рекомендуется изучить урок.

Задания по теме «Дата и время в языке Java 8. Форматирование даты». Для успешного написания задач рекомендуется изучить урок.

Задания по теме вложенные классы, дженерики в языке Java. Для успешного написания задач рекомендуется изучить урок.

Задания по теме «Коллекции в языке программирования Java». Перед выполнением заданий желательно просмотреть урок.

Задания по теме создание, перехват и обработка исключений в языке программирования Java.

В этом разделе рассмотрим задания по теме потоки ввода вывода, а также конструкция try-with-resources в языке программирования Java.

Рассмотрим практические задания по темам сериализация и клонирование в языке программирования Java.

Мавен широко используется в современных системах для сборки приложений. Наши задания помогут разобраться в том как работать с Мавеном.

Для работы с базами данных необходимо знание SQL. Задания этой части помогут попрактиковаться в составлении SQL запросов.

Умение работать с базами данных необходима при разработке современных приложений. Задания по теме JDBC прокачают ваши навыки.

Задания по многопоточности всегда одни из наиболее сложных в Java программировании. Поэтому практика здесь просто необходима. Начнем с простейших заданий.

Как научиться решать задачи в java теория

если захочется, то в несколько строк будет возвращать значения вместо их вывода. ну и можно это делать с любым типом данных

Сергей Уровень 22
25 октября 2019

То чувство, когда ты умеешь поднять микросервисы в облаке, но не умеешь написать сортировку пузырьком. Уволюсь нахрен, пойду в 11 класс к ЕГЭ готовиться по информатике. Там много таких задач.

Дмитрий Уровень 20
22 августа 2019

Честно, все решения ниже мне не понравились. В моем решении я не использовал 100 элементов, но это и не важно, оно универсальное для листов разных типов и любых размерностей.

 public class Tes < public static void main(String[] args) < Listnumbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,2,10,5)); System.out.println(findDuplicates(numbers)); List strings = new ArrayList<>(Arrays.asList("1", "st", "1", "5", "st", "10", "st")); System.out.println(findDuplicates(strings)); > private static Map findDuplicates(List list) < Mapduplicates = new HashMap<>(); for (T element:list) < if (Collections.frequency(list, element) >1) < duplicates.put(element, Collections.frequency(list, element)); >> return duplicates; > > 

Cepr0 Уровень 41
18 июля 2019

Решение для 4 задачи в один проход — слолжность меньше либо равна O(n) (равна — если дубликат окажется последним в массиве). Вставка в HashSet возвращает true в случае отсутствия элемента. Выполняется за O(1) (для целых чисел).

 public class FindOneDuplicateInArray < private static final int ARRAY_LENGTH = 100; private static Integer findDuplicate(final int[] array) < Setholder = new HashSet<>(array.length); for (Integer i : array) < if (!holder.add(i)) return i; >return null; > public static void main(String[] args) < ThreadLocalRandom random = ThreadLocalRandom.current(); IntSupplier randomInt = () ->random.nextInt(1, ARRAY_LENGTH + 1); int[] array = IntStream.generate(randomInt) .distinct() .limit(ARRAY_LENGTH) .toArray(); int duplicate = randomInt.getAsInt(); array[randomInt.getAsInt()] = duplicate; Integer result = findDuplicate(array); System.out.printf("Duplicate is %s%nResult is %s%n", duplicate, result); System.out.println("Is result correct? " + Objects.equals(result, duplicate)); > > 

Легко адаптировать также и для решения 5 задачи.
24 июня 2019
4 можно вот так например решить.

 List list = IntStream.range(1, 101).boxed().collect(Collectors.toList()); list.set(5, 100); list.sort(Comparator.naturalOrder()); for (int i = 0; i < list.size() - 1;i++) < if (list.get(i).equals(list.get(i+1))) < System.out.println(list.get(i)); break; >> 

Ярослав Уровень 40 Master
16 апреля 2018

Я бы решил 4-ю задачу через словарь, подсчитывая повторения каждого элемента, и при первой же двойке сразу можно было бы сказать, какое число дубликат. Так не нужно было бы считать суммы, а в лучшем случае выполнение программы бы закончилось еще на 2-м элементе 🙂

Как научиться решать задачи на Java?

Author24 — интернет-сервис помощи студентам

Всем привет, у меня такая ситуация.
Закончил бакалавр айти, за 4 года бездельничал, было не интересно программирование, короче провел за Dota 2, CS GO свои 4 года. И вот как не странно, после окончания универа(как я его закончил не спрашивайте, преподам было глубоко плевать на твои знания, хоть и было 0 коррупции) меня дико заинтересовало программирование.
И вот моя проблема. Я поступил в Польше на магистратуру, и там полный завал, преподают так, что я ничего не понимаю, ибо они ожидают, что мы уже суперпупер программисты. Причем там их усложняют, тоесть допустим задачу можно решить разными способами, но они ставят условия, чтоб ты решал определенным. Так вот. Мои знания на уровне видеоуроков, я понимаю основы, понимаю ООП(на процентов 50-70%). И я не знаю что мне нужно и как мне нужно заниматься, чтобы научиться решать задачи.
Я знаю про Array/Linkedlist, знаю такие классы как Scanner, File(reader, writer и тд), знаю про Socket, ServerSocket, и короче все отрывками, что уложилось в голове, то-есть я не могу самостоятельно решить не одну задачу, даже самую простую.

Открывал сайты с задачниками, не мог сделать ни одну арефметическу, с файлами, массивами и тд задачи.
Тоесть допустим я умею создавать и объекты, и файл создать, массив, но решить по ней задачу я не знаю как, даже самые елементарные на первый взгляд.(например. Дан текстовый файл, содержащий целые числа. Удалить из него все четные числа.)
И я не понимаю, что нужно мне, чтоб научиться, я не нашел ни одного видеоурока, где бы рассказывали и объясняли как нужно мыслить, что нужно уметь, чтобы решать задачи. Везде просто теория+пример самых обычных и тупых заданий типа как в ООП class Animal cat, dog бла бла, короче юзлесс примеры, которые никак на практике не используются. А когда я открываю реальный код или реальные задачи с универа, я просто потерян и без понятия как это делается и что там происходит.
Вот такой у меня ступор. Не знаю как взять и изучать эти классы, методы, говорят их тысячи, и что нет смысла их всех запоминать, но ведь как то программистов я вижу и они мне сразу начинают отвечать, что и как нужно использовать в какой задаче(какой класс нужен, какой метод), значит они как то запомнили их.
Короче прошу вас очень, обьяснить, что мне делать и как обучаться в такой ситуации.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Надо решать задачи по Java. Посмотрите
1. Дана символьные строки. Надо найти короткое слова на букву "а" и заменить ее первым словом из.

Как научиться быстро решать задачи.Советы, литереатура?
Совсем недавно начал изучать Си. Я очень люблю программировать на Си. Могу с утра до ночи это.

Как «научиться» решать задачи по теории вероятностей?
Здравствуйте уважаемые, подскажите пожалуйста, как "научиться" решать задачи по теории вероятности.

Как научиться решать задания по математической статистике на темы гипотезы
Кто-нибудь, пожалуйста, помогите научиться решать задания по математической статистике на темы.

Эксперт Java

3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220

Лучший ответ

Сообщение было отмечено Kukstyler как решение

Решение

открываешь на форуме любую тему, читаешь задачу, решаешь, если непонятно что-то — гуглишь, если совсем мозгов нет — смотришь решение. Повторяешь 100500 раз, . PROFIT!!1111

Регистрация: 20.12.2018
Сообщений: 232

так я нашел один сайт с задачами, там даже нет решения
как я пойму, что эти задачи нужно, или что я готов их уже решать, просто смысл решать суперсложные задачи, пока я не могу решать простые?

1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255

andr_17, если описание задачи кажется Вам китайской поэзией, то значит и браться за неё пока рано. По началу берите задачи понятные по описанию, то есть сама постановка задачи Вам ясна.

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

17594 / 10343 / 2826
Регистрация: 21.10.2017
Сообщений: 22,418

andr_17, попробуй codeabbey.com
Там от самых элементарных до сложных. Причем, когда задачу решишь, можно посмотреть как ее решили другие — 100500 вариантов. Рекомендую

Java. Решение практических задач

Книга Анджела Леонарда позиционируется как каталог типовых решений для Java разработчиков младшего и среднего уровней. Заявляется, что представленные решения производительны, корректны и поддерживаемы.

В книге все разбито на «задачи». Они тут нескольких типов:

  • Алгоритмические задачи — 10%
  • Структуры и алгоритмы — 5%
  • Теория языка Java — 10%
  • Стандартная библиотека Java — 50%
  • Практические приёмы — 25%

Алгоритмические задачи здесь начального уровня. Их мало. Но самое интересное — это предлагаемые решения. Автор пишет, что книга поможет укладываться в сроки. В этом она похожа на рецепты со https://stackoverflow.com/ с ровно тем же результатом: работать может и будет, но в большинстве случаев так делать не стоит. Нет, я, конечно, больше за экономическую целесообразность и согласен с цитатой:

Преждевременная оптимизация — корень всех зол.

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

правильные практические приемы и технические решения в отношении сложности, производительности, удобочитаемости

По поводу удобочитаемости тоже можно было бы поспорить, но это, в конце концов, дело вкуса. Но вот неэффективность никуда не денешь. Например, в задаче отыскания самого часто встречающегося символа предлагается в карте символ→количество искать максимум через Collections.max() для values() , а потом ещё циклом пройтись по entrySet() и поискать какой же getKey() соответствует значению, которое вернула Collections.max() .

Автор часто прибегает к регулярным выражениям там, где они совершенно излишни. И даже не предлагает их предварительно компилировать, а все время норовит вызвать replaceAll() или split() прямо внутри тела цикла. Опять же, можно было бы поспорить, что split() оптимизирована для случая односимвольного разделителя и не будет для них применять регулярные выражения. Однако, автор про это ни разу не упоминает. Более того, автор регулярно напоминает использовать Pattern.quote() при передаче параметра в split() , а значит он подразумевает именно регулярные выражения. Но даже если опираться на оптимизацию split() для односимвольных разделителей, то можно видеть, что внутри у нас ArrayList из которого данные копируются в новый массив, а автор после чуть ли не каждого split() предлагает конвертировать массив в список через Arrays.asList() . Копирования и мусор в куче, который надо будет собирать, автор просто игнорирует. StringTokenizer , по утверждению автора, обладает меньшей производительностью и из-за этого его не рекомендуется использовать. Нет, StringTokenizer , рассчитанный на Unicode code pointы и несколько разделителей, действительно медленнее в плане обработки строки по сравнению со split() при односимвольном разделителе (за вычетом дополнительного мусора и копирований). Но автор в своей сноске явным образом говорит про гибкость регулярных выражений. Да, в Javadoc на StringTokenizer есть рекомендация по использованию split() , но там нет ничего про производительность. На самом деле речь идет о том, что StringTokenizer — это Enumeration , а не Collection и значит придётся писать явный цикл для обхода, копирования и тому подобного. Не более.

StringTokenizer tokenizer = new StringTokenizer("abc, def, xyz", ";, "); List tokens = new ArrayList<>(tokenizer.countTokens()); while (tokenizer.hasMoreTokens())

Ну или тупо Collections.list() , если лень или повторное сканирование перевешивает динамический рост списка. Если хочется красоты и однострочности, то начиная с Java 9 можно сделать .asIterator().forEachRemaining() и оно ничем не будет отличаться от цикла for-each.

new StringTokenizer("abc, def, xyz", ";, ") .asIterator().forEachRemaining(System.out::println);

Вообще автор везде сует потоки с цепочками вызовов заканчивающимися collect(Collectors.toList()) и ни разу не упоминает, что список будет динамически расти, что данные будут копироваться, что мусор потом придется собирать.

Можно опять поспорить, что это копейки и на сложность алгоритма в целом не влияет. Плюс/минус 5-10% (кто же будет профилировать?) — не высокая цена за скорость разработки. Пусть так. Соглашусь. Часто важнее скорость разработки, а не скорость работы. Но тут же можно найти рецепт как скопировать объект через JSON:

  1. Берем исходный объект;
  2. Сериализуем его в JSON;
  3. Парсим получившийся текст;
  4. Копия объекта готова!

И это не прикол, а целая «задача» с детальным описанием рецепта и примером кода. Бери и копипасти. И ни слова о том, на сколько это будет быстро.

Часто говорят, что Java — это тормоза и излишнее потребление памяти. Есть мнение, что проблема не в Java, а в том как на Java пишут. Так вот автор не сильно старался сделать решения эффективными по времени или потреблению памяти.

Про структуры и алгоритмы в книге откровенно мало. В стандартной библиотеке конечно много всего готового и свое реализовывать надо не так уж и часто. Но можно было бы рассказать про варианты представления деревьев и графов с использованием инструментария Java. Дерево Фенвика и фильтр Блума здесь рассмотрены чисто для галочки.

Много «задач», в которых рассказывается о самом языке Java. В основном речь идет о нововведениях после Java 8:

  • Новые выражения switch ;
  • Автоматический тип локальных переменных и var ;
  • Функциональные интерфейсы и лямбда-выражения.

С одной стороны это все полезно. Даже не новичку. Особенно когда подается в виде практических рецептов. Но есть проблемы. Например, автор утверждает, что автоматические типы улучшают сопровождаемость кода. Приводится пример, когда локальная переменная — результат возврата функции, функцию позже поменяли и автоматическая переменная волшебным образом изменила свой тип. В коде ничего менять не надо и все счастливы. Другой пример — использование автоматического типа для «исправления» непонимания программистом того, какой же тип вернет тернарный оператор. Ну или предложение прятать тип элемента в цикле for-each. Я бы еще мог понять, если бы речь шла о длинных вложенных обобщенных типах:

Map headers = new HashMap<>(); for (Map.Entry entry : headers.entrySet())

Тогда хоть какой-то смысл появляется:

Map headers = new HashMap<>(); for (var entry : headers.entrySet())

Но автор говорит о другом. О том, что можно менять тип элементов коллекции (с int на String ) и не заморачиваться изменением кода. Сразу вспоминаешь, что Groovy ругают за def .

Также сомнительны рецепты с заменой классических шаблонов на лямбды. Смысл ведь был в инкапсуляции и полиморфизме, а тут все кишки наружу. Нет, кодить конечно быстрее, но будет ли экономия, когда придётся выбросить и переписать с нуля?

Не могу согласиться с рецептами тестирования лямбд. Тестирование — это проверка соответствия контракту. Какой контракт у лямбда-выражения? Аналогично с отладкой путем System.out.println() . Кто, как и когда будет всё это потом вычищать? А ведь будут последствия. Вместо навязчивой рекламы лямбда-выражений и рекомендаций по запихиванию их всегда и везде стоило бы описать где и когда их применять не стоит и как и на что их надо заменить. С примерами.

Стандартная библиотека — это основная часть книги. Масса рассказов, что есть вот такой-то класс или метод, полезный тем и этим. Много и более практических рецептов: если стоит такая-то задача, то решается она так-то. В принципе, все эти практические рецепты работы с датами, коллекциями, файлами, потоками, интроспекцией, многопоточностью, инструментами синхронизации, клиентом HTTP и WebSocket полезны. Особенно, если не штудировал Javadoc и не читал Core Java в двух томах.

Но в бочке мёда снова не обошлось без кастрюли дёгтя ибо есть масса неточностей и неверностей. Например, рекомендуется локальную дату конвертировать в UTC, используя нулевой сдвиг. Работать это будет только в городе Гринвич.

LocalDateTime local = LocalDateTime.now(); Instant suggested = local.toInstant(ZoneOffset.UTC); Instant correct = local.atZone(ZoneId.systemDefault()).toInstant();

Другой пример, когда автор утверждает, что List.replaceAll() и цикл с List.set(i,v) «должны работать практически одинаково». Для ArrayList это может и так, но есть и другие списки. Нет, работать LinkedList.set(i,v) в цикле будет конечно корректно, но совсем не также как ListIterator.set(v) , используемый в LinkedList.replaceAll() . Автор на такие мелочи внимание не обращает.

Частенько автор противоречит Javadoc. Например, при описании ExecutorService.invokeAll() написано:

первый вызов метода Future.get блокирует до тех пор, пока не будут завершены все экземпляры Future .

То есть, как будто между разными Future есть какая-то связь и они друг друга ждут. На самом деле ничего такого не происходит, а блокируется не столько Future.get() , сколько ExecutorService.invokeAll .

Ну или другой пример расхождения с официальной документацией — это секция про StampedLock и оптимистическую блокировку. Весь смысл оптимистичных блокировок в отсутствии блокировок. В данном случае, если очень много читателей, то писатель может ждать слишком долго, особенно для non-fair случая по умолчанию. Так вот StampedLock как раз и позволяет избежать блокировки писателя. Правильный пример кода можно найти в официальной документации:

double distanceFromOrigin() < long stamp = sl.tryOptimisticRead(); try < retryHoldingLock: for (;; stamp = sl.readLock()) < if (stamp == 0L) continue retryHoldingLock; // possibly racy reads double currentX = x; double currentY = y; if (!sl.validate(stamp)) continue retryHoldingLock; return Math.hypot(currentX, currentY); >> finally < if (StampedLock.isReadLockStamp(stamp)) sl.unlockRead(stamp); >>

Перед возвращением (фиксацией результата) мы проверяем не было ли значение изменено. При необходимости перечитываем и заново вычисляем. Мы стараемся, по возможности, избежать readLock() , которая заблокирует писателей.

А что предлагает автор? Автор предлагает делать validate() сразу за tryOptimisticRead() и ничего не делать, если validate() скажет, что записи не было (между tryOptimisticRead() и validate() ). Налицо непонимание того, как работает StampedLock и нежелание разобраться в примере из библиотечной документации.

Практические приёмы — это всякие полезные практические хитрости, которые напрямую не указаны в документации, ну или просто указание на неприметный, но полезный класс в стандартной библиотеке:

  • Преобразование 1000 в 1K и тому подобное.
  • Комбинирование Stream.reduce() , Function.identity() и Function.andThen() на списке функций для вызова их цепочкой.
  • Генераторы потоков.

Сильно портит книгу перевод:

  • Масса опечаток.
  • Для многих терминов используется транслитерация вместо перевода («состояние терминации», «дерегистрированных участников», «конкурентно запустить», «с несколькими имплементациями этого интерфейс»).
  • И наоборот, некоторые термины переведены крайне странно («обход должен быть жестоко терминирован», «альтернатива подклассированию», «стековая трасса сбоя», «замок на уровне объекта», «будет уменьшать стопор», «семафор может начинаться и умирать», «продвинуть исключение», «приращение», «атомарно наращивает переменную»).
  • Ближе к концу книги, переводчик перестал заморачиваться и так и оставил машинный перевод с тут и там несогласованными окончаниями.

Орфография — это неприятно, но терпимо. Но терминология — это серьезней. Часть просто неприятно читать. Например, все эти многонитиевости. Причем, переводчик не поленился и расписал целую секцию почему именно нити, хотя редактор в сноске указала, что потоки. Но или уговорить не удалось, или (что видно по числу опечаток) ограничилась первым десятком страниц.

Вот научится человек стопорам, тупикам и запираниям на замок, и попробуй, пойми потом, что речь о CountDownLatch , deadlock и acquire lock (затвор, взаимная блокировка и получение блокировки в терминах той же Core Java).

В главе про шаблоны используется термин трафаретный метод. При этом, в тексте даже есть ссылка на GoF. То есть переводчик, даже если он не специалист в данной предметной области, мог просто подглядеть. А ведь шаблоны — это ещё и язык, который призван помочь в объяснении того, как система устроена или должна быть устроена.

Есть места, где корявый перевод меняет смысл написанного. Например:

Блокирующая нить исполнения обычно находится в состоянии BLOCKED …​

Неопытный разработчик может и не понять, что речь о том потоке, который был заблокирован, а не о том, который блокирует.

Резюмируя, можно сказать, что книга крайне неоднозначна. Опытный разработчик может найти что-то новое, если не следил за эволюцией. Может освежить память о том, что давно не использовал. Или даже может найти пару рецептов, о которых ранее не знал. Не очень опытный разработчик может узнать очень много. Это даже может быть лично ему полезно, чтобы «укладываться в сроки». Также как может быть полезен https://stackoverflow.com/, чтобы копипастить оттуда первый попавшийся рецепт. Если новичок «вырастит» на этой книге, то велик шанс того, что его работу придется переделывать. А ведь он ещё и может ссылаться на данную книгу в обоснование своей точки зрения. Тогда и взаимопонимание может быть затруднено. Хоть автор и позиционирует книгу для начального и среднего уровней, я бы рекомендовал её (и то не сильно) только сложившимся разработчикам. Прочитавший же её новичок будет просто опасен.

  • Java
  • Алгоритмы
  • Профессиональная литература

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *