решение должно построить пирамиду из заданного входного списка целых значений. Номера сортируются по возрастанию сверху вниз, слева направо.
Пустые пространства заполняются нулями. Чтобы заставить симметричные входные числа пирамиды чередуться с нулями. Входные:
List<Integer> input = Arrays.asList(1, 3, 2, 9, 4, 5);
Выходные:
int[][] expected = new int[][]{
{0, 0, 1, 0, 0},
{0, 2, 0, 3, 0},
{4, 0, 5, 0, 9}};
Мое решение:
public int[][] buildPyramid(List<Integer> inputNumbers) {
boolean flag;//Флаг для возможности/невозможности построения пирамиды
int[][]matrix;//Получившаяся матрица
System.out.println("Введенная последовательность: " + inputNumbers);
int size = inputNumbers.size();//Проверяем размер полученного массива
//Проверим, является ли данное число треугольным
int count = 0;int rows = 1;int cols = 1;
while(count < size){
count=count+rows;
rows++;
cols=cols+2;
}
rows = rows-1;//Актуальное число строк
cols = cols-2;//Актуальное число столбцов
if(size==count) {
flag = true;//Если возможно построить матрицу
}else flag = false;
if(flag){
List<Integer> sorted = inputNumbers.stream().sorted().collect(Collectors.toList());
System.out.println("Отсортированная последовательность по возрастанию: " + sorted);
System.out.println("Количество элементов в последовательности: " + size);
System.out.println("Число столбцов(cols) матрицы будет равно: " + cols);
System.out.println("Число строк(rows) матрицы будет равно: " + rows);
System.out.println("*******СТРОИМ МАТРИЦУ*******");
matrix = new int[rows][cols];//Задаем размерность матрице
int centr = (cols/2);//Находим центральную точку матрицы
int i = 1;//ячейка строк
int c = 1;//счетчик цикла
count = 0;
//В этом цикле у меня затык, я не понимаю как заполнить его цифрами из последовательности в заданном порядке
while(i <= rows) {
while(count < i) {
matrix[i-1][rows-c] = inputNumbers.get(c-1);
count++;
c++;
}
count=0;
i++;
}
for(int [] a: matrix)//выводим матрицу на экран
{
for(int b: a)
System.out.print(b+" ");
System.out.println();
}
}//Выбрасываем исключение
else{
throw new CannotBuildPyramidException();
}
return matrix;
}
Напишу середину (остальное не трогал):
if(flag){
List<Integer> sorted = inputNumbers.stream().sorted().collect(Collectors.toList());
System.out.println("Отсортированная последовательность по возрастанию: " + sorted);
System.out.println("Количество элементов в последовательности: " + size);
System.out.println("Число столбцов(cols) матрицы будет равно: " + cols);
System.out.println("Число строк(rows) матрицы будет равно: " + rows);
/******* ЗАПОЛНЯЕМ МАТРИЦУ НУЛЯМИ *******/
matrix = new int[rows][cols];//Задаем размерность матрице
for (int[] row : matrix) {
Arrays.fill(row, 0);
}
/******* СТРОИМ ТРЕУГОЛЬНИК *******/
int center = (cols / 2);//Находим центральную точку матрицы
count = 1; // сколько чисел будет в строке
int arrIdx = 0; // индекс массива
for (int i = 0, offset = 0; i < rows; i++, offset++, count++) {
int start = center - offset;
for (int j = 0; j < count * 2; j +=2, arrIdx++) {
matrix[i][start + j] = sorted.get(arrIdx);
}
}
/******** ВЫВОДИМ МАТРИЦУ НА ЭКРАН *******/
for(int [] a: matrix)//выводим матрицу на экран
{
for(int b: a)
System.out.print(b+" ");
System.out.println();
}
}//Выбрасываем исключение
else{
throw new CannotBuildPyramidException();
}
Не знаю, уловите ли смысл. Надо было нарисовать матрицы визуально где-нибудь и по ним представить логику.
Смысл в том, что
count
. center - offset;
j +=2
), а так как количество цифр count
в таком случае может оказаться меньше шага j
, то счетчик будет пробегаться не по количеству count
, а count * 2
Скорее всего это можно всё подсократить. Но в целом должно работать
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Хочу в приложении сделать поддержку некоторых спец клавиш (F1, F2, F3
Допусти есть listView состоящий из textView'sНужно к каждому textView прицепить какие-то данные, но чтобы они не были видны пользователю
При работе с Spring столкнулся с таким синтаксисом {val} в мапингеВот такой метод:
ЗдравствуйтеЗадание заключается в том, чтобы добавить три элемента во множество HashSet, затем удалить один элемент из него и вывести все это...