Как получить треугольник Флойда в JAVA с убывающими числами

В недавнем интервью я попросил написать код треугольника Флойда для приведенной ниже скороговорки. Каким будет решение этой проблемы в JAVA?

1
3 2
6 5 4
10 9 8 7
15 14 13 12 11

Я не смог уловить логику этого. Это то, чего мне удалось достичь.

public class Test2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        /*
        1
        3 2
        6 5 4
        10 9 8 7
        15 14 13 12 11
        */
        int k =1;
        
        for(int i = 1;i<15;i++)
        {
            for(int j =1;j<i;j++)
            {
            
                System.out.print((k+i)-(j));
                System.out.print(" ");
            }
        
            System.out.println("");
        
        }

    }

}

Подумайте о том, что вы видите физически: в 1-й строке есть 1 число, во 2-й строке — 2, вплоть до 5-й строки — 5 чисел. В каждой строке числа добавляются к строке в обратном порядке. Итак, внешний цикл от 1 до 5, внутренний цикл от 1 до текущего значения внешнего цикла и построение строки, беря следующее число в последовательности и добавляя его к началу строки. В конце внутреннего цикла вытяните строку целиком.

Nick Gris 21.02.2024 20:00

Есть небольшие ошибки, но самая большая - забыта k++

Sam 21.02.2024 20:05

Да, я согласен, что мой код плохой. Но я не могу придумать, как можно обрабатывать нисходящий порядок текущей последовательности.

kshitij_sawant 21.02.2024 20:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
118
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Давайте подумаем о серии, индексированной n, где n=1 — первая запись в серии. Некоторые первоначальные наблюдения:

  1. Каждая последующая строка добавляет один элемент. Таким образом, количество элементов в строке равно n.
  2. Каждая строка — это следующие n числа, которые еще не посчитаны.
  3. Конец каждой строки начинается с начала предыдущей (справа налево).

Просто собираюсь сделать это в одиночку:

int trailingValue = 1; //the value at the end of each line (starting at 1)
for (int n = 1; n <= 5; n++) { //for each line of the triangle we wish to print
    //print the preceeding numbers up to (n-1) (above the trailing value) ahead of time.
    for (int i = trailingValue + n - 1; i > trailingValue; i--) {
        System.out.print(i + " ");
    }
    //print our "trailing value"
    System.out.println(trailingValue);
    //add how many numbers we just printed for our next trailing value.
    trailingValue += n;
}

Обратите внимание, что приведенный выше код цикла можно упростить, особенно с учетом приведенных ранее замечаний. Единственная причина, по которой я разделил его таким образом, заключалась в том, чтобы определить, когда элемент должен быть в паре с пробелом или символом новой строки (т. е. + " " против println).

Вы можете сделать это следующим образом. Время печати новой строки связано с суммой arithmetic series из 1 to n, вычисляемой как n*(n+1)/2.

  • инициализировать значения
  • за каждую итерацию
    • построить строку с текущим значением для печати
    • если пришло время печатать
      • вычислить в следующий раз, чтобы распечатать
      • распечатать текущую строку
  • иначе продолжить цикл;
int timeToPrint = 1;
int n = 1;
String row = "";
for (int i = 1; i <= 15; i++) {
    row = i + " " + row;
    if (i == timeToPrint) {
        n++;
        timeToPrint = n*(n+1)/2;
        System.out.println(row);
        row = "";
    }
}

принты

1 
3 2 
6 5 4 
10 9 8 7 
15 14 13 12 11 

С помощью математики мы можем вывести, что каждая строка начинается с треугольного числа:

1, 3, 6, 10, 15, ..., n * (n + 1) / 2, ...

Итак, мы легко можем создать произвольный треугольник height:

int height = 5;    

for (int n = 1; n <= height; ++n) {
    for (int i = 0; i < n; ++i) {
        System.out.print(n * (n + 1) / 2 - i);
        System.out.print(" ");
    }

    System.out.println();
}

Это немного странно, но удовлетворяет заявленному требованию, поскольку высота кажется фиксированной. Непредвзятый интервьюер может это оценить! :)

private static final String FLOYDISH = """
    1
    3 2
    6 5 4
    10 9 8 7
    15 14 13 12 11""";

public static void main(String[] args) {
    System.out.println(FLOYDISH);
}

Другие вопросы по теме