已经开发接近8年,面试要求我手写一个菱形代码。。。

先说一下故事的背景:

前一段时间因为自己转战城市需要换工作,所以面试的某省会的一家公司。整个面试的过程,如果满分100,我只能给59分。

首先我个人的表达没有完全说透(我以为的基础理解,应该都知道),我自己也是有问题。其次感受到了面试官的一个高高的态度(开口第一句,工作这么多年,项目系统做得不多)。

作为一个开发过复杂金融系统的开发人员此刻感受到了深深的敌意(鄙人此前的维护过的一个系统,不了解有没有算系统重复代码,至少代码量在4000万行以上)我不知道,面试官哪里来自信。在此也希望看到此篇博客的程序员们,未来不要成为一个傲慢的人。每个人可以对自己很有信心,但是不要去贬低别人的经历,因为那不是你的经历。

========================好了,吐槽到此为止===================

面试的最后是让我用白纸写一个菱形的算法。。。输入任意的基数,可以输出不同的菱形,例如输入5,展示图形如下:

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 

这个算法题,其实很简单,翻一下我的博客,早在2017年我在我的博客已经写过,以前没有写具体思路。昨天刚好高考,我也就在此写一下这个题的算法,说透,比高考的数学填空题还easy

这种在代码里面属于中低难度的题型。重点在于分析。

我们以输入5的场景来进行分析,首先我们肯定是要分别打印空格和*号的,然后我们每一行去观察。可以得出如下规律:

 第一行:4个空格  1个星号

第二行:3个空格  2个星号

第三行:2个空格  3个星号

第四行:1个空格  4个星号

第五行:0个空格,5个星号

下面的形状倒过来规律

第一行:1个空格 4个星号

第二行:2个空格 3个星号

第三行:3个空格  2个星号

第四行:4个空格 1个星号

我们直接写死可以得出下面的代码:

public class lingxing01 {
    public static void main(String[] args) {
        //控制行号
        for (int i = 0; i < 5; i++) {
            //先打印空格
            for (int j = 0; j <4-i; j++) {
                System.out.print(" ");
            }

            //再打印*
            for (int k = 0; k <= i ; k++) {
                System.out.print("* ");
            }
            //每次打印完毕后换行
            System.out.println();
        }

        for (int i = 0; i < 4; i++) {
            //先打印空格
            for (int j = 0; j <=i; j++) {
                System.out.print(" ");
            }

            //再打印*  观察阵列的数字规律
            for (int j = 0; j <4-i; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }

    }
}

重点在于是不是看到了规律

 下半段的打印也是这样得出的规则。

我们再将上面的代码进行通用化处理,代入变量。代码如下:


import java.util.Scanner;

public class lingxing {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //控制行号
        for (int i = 0; i < n; i++) {
            //先打印空格
            for (int j = 0; j <n-1-i; j++) {
                System.out.print(" ");
            }

            //再打印*
            for (int k = 0; k <= i ; k++) {
                System.out.print("* ");
            }
            //每次打印完毕后换行
            System.out.println();
        }

        for (int i = 0; i < n-1; i++) {
            //先打印空格
            for (int j = 0; j <=i; j++) {
                System.out.print(" ");
            }
            
            //再打印*  观察阵列的数字规律
            for (int j = 0; j <n-1-i; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }

    }
}

实际效果展示下:

5
    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 
3
  * 
 * * 
* * * 
 * * 
  * 

是不是这就是一道找规律填数字的题?

===============结束=====================================

文章最后提醒,各位看客老爷,今后如果有机会当面试官,请不要拿出一张纸给面试者写代码,至少如我这类是很反感的(好歹,你给个电脑)。我也曾经当面试官,面试了不下百人,手写算法,我是没这么弄过,就算出题,也就让说个大致思路就行了。毕竟实际写代码时,5分钟想,1小时调。我想纯手写的年代,也就是大学时的期末考试。

最后希望程序员行业不要越来越卷,大家都幸福安康,哈哈。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值