#java #loops #for-loop #printing #square
#java #циклы #for-цикл #печать #квадрат
Вопрос:
Мне нужен код, который поможет мне напечатать квадрат звездочек с целочисленным вводом (в данном случае число равно 5), квадрат должен быть пустым внутри.
например:
Ищем этот вывод
* * * * *
* *
* *
* *
* * * * *
что я получаю
* * * *
*
*
*
* * * *
Мне не хватает моей правой стороны квадрата.
МОЙ код:
System.out.print("Please enter a number: ");
side = input.nextInt();
for (int i = 0; i < side - 1; i ) {
System.out.print("* ");
}
for (int i = 0; i < side; i ) {
System.out.println("*");
}
for (int i = 0; i < side; i ) {
System.out.print("* ");
}
}
ввод
5
вывод
* * * *
*
*
*
* * * *
Ответ №1:
Вы можете сделать это с помощью вложенного цикла for .
for (int i = 0; i < side; i ) {
for (int j = 0; j < side; j ) {
if (i == 0 || i == side - 1 || j == 0 || j == side - 1) {
System.out.print("* ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
Выведите a *
, если это либо первая строка / столбец, либо последняя строка / столбец; в противном случае выведите два пробела.
Комментарии:
1. Это оставит у вас лишнее пространство на правом краю квадрата, что может оказаться неприемлемым для OP (или его учителя). (Хотя я только что заметил, что решение OP также оставит лишние пробелы на правом краю.) И это можно было бы сделать более эффективным, как описано в моем комментарии к ответу Томаса М.
Ответ №2:
Это можно сделать с помощью одного цикла For со сложностью O (n)
public static void main(String[] args) {
System.out.print("Please Enter a Number ");
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
if(number >= 3) {
String endPattern = new String(new char[number]).replace("", " *");
String midPattern = String.format("%-" (number-2)*2 "s %s", " *"," *");
for(int i=1; i<= number; i ) {
if(i==1 || i==number) {
System.out.print(endPattern);
}
else {
System.out.print(midPattern);
}
System.out.println();
}
}
}
Вывод (для ввода 3)
Please Enter a Number 3
* * *
* *
* * *
вывод (для ввода 7)
Please Enter a Number 7
* * * * * * *
* *
* *
* *
* *
* *
* * * * * * *
Комментарии:
1. Да, более эффективно, чем вложенные циклы for . (Но не забывайте, что
replace
format
оба метода and должны перебирать символы для работы, так что это больше похоже на последовательные циклы for, а не только на один. Тем не менее, это неизбежно, и это лучше, чем вложенные циклы, а затем генерирование одного и того же значения снова и снова.)
Ответ №3:
Вам нужно добавить дополнительную звездочку в конце среднего цикла for . Это можно сделать, вложив второй цикл пробелов for с последующей печатью звезды.
for (int i = 0; i < side; i ) {
System.out.print("*");
for (int j = 0; j < side; j ) {
System.out.print(" ");
}
System.out.println("*");
}
Комментарии:
1. Подумайте о том, как вы могли бы сделать это более эффективным. Внутренний цикл будет выдавать точно такую же последовательность символов каждый раз, и фактически каждая строка, сгенерированная внешним циклом, будет содержать точно такую же последовательность символов каждый раз. Так почему бы не использовать внутренний цикл только один раз (переместив его перед внешним циклом), а затем сохранить результат во временной переменной, которую вы можете использовать во внешнем цикле? Таким образом, вы выполняете итерацию только
side side
раз, аside * side
не раз.2. @Bobulous Хм .. хорошая идея! Я мало думал об эффективности в этой проблеме. Имеет смысл. Спасибо!
3. Также обратите внимание, что вы не добавляете достаточно места для заполнения воздушного зазора. Обратите внимание, что результат, показанный OP, имеет пробелы между каждой звездой. Таким образом, добавление только
side
пробелов между левым и правым краями не даст правильного внешнего вида.4. @Bobulous Да, это была именно моя проблема. спасибо за совет. Я попробую и посмотрю, смогу ли я найти желаемый результат.
5. @Bobulous я опубликовал ответ (O) n сложности.