Массивы
Задачи, для решения которых нужно понимать синтаксис и правила работы с массивами в Java. Уметь обращаться к конкретным элементам массива, итеративно перебирать все элементы и т.д.
Массивы — одна из начальных тем в изучении любого языка программирования и, соответственно, каких-то сложных задач здесь нет, но некоторые всё равно могут быть довольно интересны.
Задача 1
Дана строка "Hello, World!". Необходимо разбить эту строку на две части методом split(",") и вывести первую часть в консоль. Всю инструкцию необходимо уместить в одну строку.
Для решения задачи достаточно помнить, что оператор взятия элемента массива [] может использоваться в любом месте, где у нас возникает массив, в том числе сразу после вызова метода, возвращающего этот массив.
Таким образом, решение может быть таким:
System.out.println( "Hello, World!".split(",")[0] ); //Hello
Поскольку метод split возвращает массив, нам совершенно необязательно сохранять ссылку на этот массив в какую-то переменную, чтобы получить доступ к его элементам. Можно сразу после закрывающей скобки метода использовать оператор взятия элемента массива [] с необходимым индексом (в нашем случае — 0).
Отметим, что при таком использовании [] мы рискуем получить java.lang.ArrayIndexOutOfBoundsException, если не угадаем с индексом.
Например, так:
System.out.println( "Hello, World!".split(",")[2] ); //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
Задача 2
Дан двумерный массив двузначных чисел:
Integer[][] matrix = {
{23, 73, 15},
{56, 33, 21},
{34, 78, 87},
{22, 90, 74},
{76, 89, 55}
};
Напишите метод со следующей сигнатурой: void printMatrix(Object[][] matrix), который бы выводил содержимое массива в консоль.
Первый индекс двумерного массива указывает строку, а второй — столбец. Таким образом нужно организовать сложенный цикл, который бы итерировал строки, а внутри строк столбцы. При этом данные из столбцов нужно выводит в строчку с пробелом, а данные из строк разделять переносом строки. Тогда решение может выглядеть так:
static void printMatrix(Object[][] matrix) {
for (int y = 0; y < matrix.length; y++) {
for (int x = 0; x < matrix[0].length; x++) {
System.out.print(matrix[y][x] + " "); //внутри строки
}
System.out.println(); //переход на новую строку
}
}
Задача 3
Дан двумерный массив двузначных чисел, моделирующий матрицу:
Integer[][] matrix = {
{23, 73, 15},
{56, 33, 21},
{34, 78, 87},
{22, 90, 74},
{76, 89, 55}
};
Напишите метод Object[][] transponeMatrix(Object[][] original), который бы транспонировал данную матрицу, то есть превратил первую строку исходной матрицы в первый столбец целевой, вторую строку — во второй столбец и так далее, и возвращал результат транспонирования в виде массива.
Напишите метод, который бы выводил полученный двумерный массив в консоль (если ещё не написали). Результат работы метода, применённого к данным из примера должен быть таким:
23 56 34 22 76
73 33 78 90 89
15 21 87 74 55
Для решения задачи достаточно создать новый двумерный массив и организовать вложенный цикл, который бы перебирал все элементы исходного массива, но вставлял значения в новый массив, меняя индексы местами:
static Object[][] transponeMatrix(Object[][] original) {
int xAxis = original.length;
int yAxis = original[0].length;
if (xAxis == 0 || yAxis == 0) {
throw new IllegalArgumentException("Одно из измерений массива равно нулю.");
}
Object[][] transponed = new Object[yAxis][xAxis];
for (int x = 0; x < xAxis; x++) {
for (int y = 0; y < yAxis; y++) {
transponed[y][x] = original[x][y];
}
}
return transponed;
}
Задача 4
Дан одномерный массив целых чисел: int[] nums = {1,2,3,4,5};
Напишите метод boolean contains(int[] numArray, int num), который принимает в качестве первого аргумента собственно массив целых чисел, а в качестве второго просто целое число и возвращает true, если такое число встречается в массиве и false, если нет.
Задача тривиальна, элементы массива необходимо перебрать в цикле и каждый сравнить с вторым аргументом метода. Если встретится совпадение, то вернуть true, если нет, то по умолчанию возвращаем false:
static boolean contains(int[] numArray, int num) {
for (int i = 0; i < numArray.length; i++) {
if (numArray[i] == num) {
return true;
}
}
return false;
}
Задача 5
Напишите код, который бы создавал два одномерных массива, заполненных натуральными числами от 1 до 10, и выводил на консоль таблицу умножения этих чисел.
Результат должен иметь следующий вид:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
То есть при выводе чисел должно быть проведено минимальное форматирование таблицы. Между числами должны быть поставлены пробелы таким образом, чтобы таблица получилась "ровной".
Для решения задачи достаточно создать и инициализировать два массива и организовать вложенный цикл, который бы перебирал массивы и выводил произведения чисел, расположенных в соответствующих индексах.
Чтобы таблица получилась ровной, достаточно учесть тот факт, что все произведения (кроме 10×10) представляют собой либо однозначные, либо двузначные числа. Если сделать расстояние от однозначного числа до любого следующего в два пробела, а расстояние от двузначного до следующего в один пробел, то таблица получится ровной.
Таким образом перед выводом результата произведения необходимо просто добавить условие, в котором будет определяться, сколько пробелов ставить.
Решение может выглядеть так:
int x[] = new int[]{1,2,3,4,5,6,7,8,9,10};
int y[] = new int[]{1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (x[i] * y[j] < 10) {
System.out.print(" ");
} else {
System.out.print(" ");
}
System.out.print(x[i] * y[j]);
}
System.out.println();
}
Задача 6
Дана строка с произвольным текстом без знаков препинания.
Напишите код, который выведет в консоль слова этого текста в обратном порядке. Например,
фраза Java is my favourite programming language
превращается в language programming favourite my is Java
Используйте метод split(" ") на объекте класса String, чтобы превратить строку в массив символов.
Простейшее решение может выглядеть так:
public static void main(String[] args) {
String orig = "Java is my favourite programming language";
String goal = "";
String[] words = orig.split(" ");
for (int i = words.length - 1; i >= 0; i--) {
goal += words[i] + " ";
}
System.out.println(goal);
}
Строка String[] words = orig.split(" "); превратит текст в массив слов, разделив его по пробелам.
Ключевой момент заключается в том, чтобы прочитать полученный массив в обратном порядке. Для этого нужно правильно написать управляющий оператор for. Счётчик цикла i инициализируется индексом последнего элемента массива: int i = words.length - 1; Массив итерируется, пока i не достигнет 0 (элемент с индексом 0 -- первый в массиве). Значение i уменьшается на единицу в каждой итерации.
Таким образом, оператор for должен выглядеть следующим образом:
for (int i = words.length - 1; i >= 0; i--).
Также составляя итоговую строку, нужно не забыть проставить пробелы между словами:
goal += words[i] + " ";