/*这是完整的问题:
编写一个名为 printSquare 的方法,该方法接受两个整数参数(最小值和最大值(,并以方形模式打印从最小值到最大值范围内的数字。通过示例比通过解释更容易理解方形模式,因此请查看下表中的示例方法调用及其生成的控制台输出。
正方形的每一条线都由最小值和最大值之间递增整数的圆形序列组成。每行打印此序列的不同排列。第一行以 min 开头,第二行以 min + 1 开头,依此类推。当任何行中的序列达到最大值时,它会绕回最小值。
您可以假设该方法的调用方将传递一个 min 和一个 max 参数,使得 min 小于或等于 max。
嗨,伙计们,我遇到了这个问题,我无法解决。就是把这个方法叫做printSquare(1,5)
;要获取此输出,请执行以下操作:
12345
23451
34512
45123
51234
到目前为止,这是我的代码。我似乎无法将前面的数字移到后面。
public static void printSquare (int startNum, int height){
if (startNum == height){
System.out.print(height);
return;
}
for (int i = startNum; i <= height; i++){
int max = startNum;
int j = i;
for (j = i; j <= height; j++){
System.out.print (j);
}
System.out.println();
}
}
如果你的内部循环以 i
开头,它必须以 height + i
结尾,而不仅仅是height
输出是正方形的,否则它将是一个三角形。您想了解模运算符%
以确定除法的余数以处理"溢出"。
您给出的规范不清楚如果startNum != 1
"溢出"会发生什么。
此外,height
如果保护条件(startNum == height)
实际上意味着高度(并且,因为它说的是 printSquare,宽度(,那么显然是错误的。我希望printSquare(4, 4)
打印四行和四列,而不仅仅是一行和一列。命名似乎有问题。一般来说,这样的警卫是可疑的。算法代码应该是通用的,不需要单独处理此类特殊情况。
这是一个可能的实现,适用于printSquare(1, 5);
和printSquare(1, 1);
的情况。对于其他情况,您的规格不够清晰。
public class Main {
public static void main(final String... args) {
printSquare(1, 5);
printSquare(1, 1);
//printSquare(2, 6);
//printSquare(4, 4);
}
public static void printSquare(int startNum, int height) {
for (int i = startNum; i < startNum + height; i++) {
for (int j = i; j < height + i; j++) {
System.out.print((j - 1) % height + 1);
}
System.out.println();
}
System.out.println();
}
}
如果结束编号不是由height
单独确定,而是由startNum + height - 1
确定,则可能的解决方案如下所示:
public static void printSquare(int startNum, int height) {
for (int i = startNum; i < startNum + height; i++) {
for (int j = 0; j < height; j++) {
System.out.print((j + i - startNum) % (height) + startNum);
}
System.out.println();
}
System.out.println();
}
提供使用 lambda 的替代 Java 8 解决方案。对于一个简单的任务来说,这可能是矫枉过正
public static void printSquaresJava8(int x, int y) {
int count = y - x + 1;
IntStream sequence = (IntStream.rangeClosed(x, y).<Integer>flatMap(i -> IntStream.rangeClosed(i, i + y).limit(count).<Integer>map(j -> j > y ? j - count : j)));
List<Integer> numbers = sequence.boxed().collect(Collectors.<Integer>toList());
IntStream.<Integer>rangeClosed(0,count-1).forEach(i ->
{numbers.subList(count * i, count + count*i).forEach(j -> System.out.print(j + " "));
System.out.println();
}
);
}
//用 c++ 编写。呼叫号码平方(1, 5( 您的第一个 for 循环是您的行,第二个嵌套的 for 循环是您的列。k 从最小值开始。Col for 循环将从最小值到最大值打印出 K,在第一次迭代中,它将水平打印出 1 2 3 4 5。一旦 k 等于最大值,将其重置为 min,以便外循环。可以打印出从 1 到 5 的行。想想它是否像 2D 数组或网格。
void numberSquare(int min, int max) {
for(int i = min; i <= max; i++) {
int k = i;
for(int j = min; j <= max; j++) {
cout << k;
if (k == max) {
k = min;
}
else k = k+1;
}
cout << endl;
}
}