之前看到的一道某公司的面试题,早就想写了太懒了一直没动,一个多月没写博客了,今天正好就这个问题写一篇
打印的效果图:
网上有很多关于如何打印菱形的,但是基本上都是这个思路:将菱形分为上下两部分,分别打印,代码如下:
package E01;
/**
* 打印菱形
*
* 打印空心菱形 即把*换成“ ” 然后一个for()循环结束后打印* 如图中的 - 打印的位置
*
* @author he
*
*/
public class Rhombus {
public static void main(String[] args) {
// 打印上面半部分菱形
for (int i = 1; i < 5; i++) {
// 打印空格
for (int j = 1; j < 5 - i; j++) {
System.out.print(" ");
}
// System.out.print("-");
for (int k = 0; k < i * 2 - 1; k++) {
System.out.print("*");
}
// System.out.print("-");
System.out.println();
}
// 打印下部分菱形
for (int i = 4; i > 1; i--) {
for (int j = 0; j < 5 - i; j++) {
System.out.print(" ");
}
for (int k = 2 * i - 3; k > 0; k--) {
System.out.print("*");
}
System.out.println();
}
}
}
用两个大的for循环以及嵌套两个小的for循环,那有没有什么办法优化这个代码??答案是有的,看这篇文章的人可能已经有人猜到了,使用绝对值!
这样只需要一个大的for循环和两个小的for循环就能达到一样的效果
代码如下:
package E01;
/**
* 打印菱形优化版
* 利用绝对值
* args:7
* @author he
* 规律:比如args:7 则第1行有7/2=3个空格和(7/2+1-7/2)×2-1个“*”
*/
public class Rhombus02 {
public static void main(String[] args) {
int N=Integer.valueOf(args[0]);//菱形的行数,要为奇数
int space=N/2;//第一行的空格数
for(int i=space;Math.abs(i)<space+1;i--){
//打印空格
for(int j=Math.abs(i);j>0;j--){
System.out.print(" ");
}
//打印“*”型
for(int k=(space+1-Math.abs(i))*2-1;k>0;k--){
System.out.print("*");
}
System.out.println();
}
}
}