Skip to main content

Задание 24

В этом блоке задач предполагается, что в файле одна строка, просто прочитаем её найдём требуемое в задаче значение.

Пример 1

Задача

Текстовый файл 24.txt состоит не более чем из 10610^6 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны. Для выполнения этого задания следует написать программу.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Example1 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/24.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если текущий символ отличается от следующего
if (s.charAt(i) != s.charAt(i + 1)) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);

}
}

Вывод программы:

35

Ответ: 35

Пример 2

Задача

В текстовом файле k8.txt находится цепочка из символов, в которую могут входить заглавные буквы латинского алфавита A...Z и десятичные цифры. Найдите длину самой длинной подцепочки, состоящей из одинаковых символов. Для каждой цепочки максимальной длины выведите в отдельной строке сначала символ, из которого строится эта цепочка, а затем через пробел – длину этой цепочки.

Если символы одинаковые, просто замените в проверке != на ==.


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Example2 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-8.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если текущий символ совпадает со следующим
if (s.charAt(i) == s.charAt(i + 1)) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);

}
}

Вывод программы:

10

Ответ: 10

Пример 3

Задача

Текстовый файл 24-157.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита A...Z. Определите максимальное количество идущих подряд символов, среди которых нет сочетания стоящих рядом букв P и R (в любом порядке).


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Example2 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-8.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если нет сочетания стоящих рядом букв `P` и `R`
if (!((s.charAt(i) == 'P' && s.charAt(i + 1) == 'R') ||
(s.charAt(i) == 'R' && s.charAt(i + 1) == 'P'))) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);

}
}

Вывод программы:

2940

Ответ: 2940

Пример 4

Задача

В текстовом файле k7-9.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите максимальную длину цепочки вида ABCABC... (составленной из фрагментов ABC, последний фрагмент может быть неполным).

В этой задаче необходимо увеличивать переменную cnt на три, т.к. искомая строка имеет длину три, а к i прибавляется 2, т.к. ещё 1 прибавит сам цикл for.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Example4 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-9.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 0
int cnt = 0;
// масимальная длина тоде равна 0
int maxCnt = 0;
// перебираем все индексы
for (int i = 0; i < s.length() - 2; i++) {
// если строка с позиции i начинается на ABC
if (s.charAt(i) == 'A' && s.charAt(i + 1) == 'B' && s.charAt(i + 2) == 'C') {
// смещаемся на два дополнительных знака
i += 2;
// увеличиваем количество на 3
cnt += 3;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 0;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);

}
}

Вывод программы:

30

Ответ: 30

Задания для самостоятельного выполнения

Файлы для задач