В недавнем интервью я попросил написать код треугольника Флойда для приведенной ниже скороговорки. Каким будет решение этой проблемы в 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("");
}
}
}
Есть небольшие ошибки, но самая большая - забыта k++
Да, я согласен, что мой код плохой. Но я не могу придумать, как можно обрабатывать нисходящий порядок текущей последовательности.




Давайте подумаем о серии, индексированной n, где n=1 — первая запись в серии. Некоторые первоначальные наблюдения:
n.n числа, которые еще не посчитаны.Просто собираюсь сделать это в одиночку:
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);
}
Подумайте о том, что вы видите физически: в 1-й строке есть 1 число, во 2-й строке — 2, вплоть до 5-й строки — 5 чисел. В каждой строке числа добавляются к строке в обратном порядке. Итак, внешний цикл от 1 до 5, внутренний цикл от 1 до текущего значения внешнего цикла и построение строки, беря следующее число в последовательности и добавляя его к началу строки. В конце внутреннего цикла вытяните строку целиком.