V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KomiSans
V2EX  ›  程序员

自己上班期间答的机试题,写的不是很好,公司在上海。如图

  •  2
     
  •   KomiSans ·
    KomiSans · 2021-02-21 16:29:56 +08:00 · 2973 次点击
    这是一个创建于 1130 天前的主题,其中的信息可能已经有所发展或是发生改变。

    yo7LjA.png yo7476.jpg yo7h0x.png yo7fn1.jpg yoHSN8.png yo7zAf.png 后面两张是我自己答的,在最后 txt 发给他告诉他答完了之后就没再理我,可能是已经满了,也可能是我答的太烂了

    8 条回复    2021-02-21 23:24:58 +08:00
    jworg
        1
    jworg  
       2021-02-21 17:44:50 +08:00   ❤️ 1
    如果是我的话,这个菱形是有规律的,两个等差数列减去一个最后一项,然后个数就是 n^2+n+1<(n+1)^2,然后对于 14 就是,14 开方近似 3,最长一行在 3,个数是 2*3 -1 =5,总个数是 13,剩余 1,菱形的中心点是 ( 3,3 ),然后打印
    KomiSans
        2
    KomiSans  
    OP
       2021-02-21 18:23:44 +08:00
    @jworg 我这个主要是从最小的那个中间的点数开始算,一点点扩展成菱形,把数量离着给定数值最近的那个获取就好,所以点数是递增 2 的
    Sunyanzi
        3
    Sunyanzi  
       2021-02-21 22:01:31 +08:00   ❤️ 3
    第一题还挺有趣的 ... 但我没看懂你的写法 ... 我吃饱了也没事自己写了一版如下 ...

    i.imgur.com/nYGhFDJ.png

    打菱形的过程随便写的 ... 直觉觉得还有优化空间 ... 但不在核心算法里我就懒得做了 ...

    以及最后算总量的那个 u 其实也可以套公式求 ... 但我想来想去感觉还是直接累加比较容易就累加了 ...

    供参考 ...
    young1lin
        4
    young1lin  
       2021-02-21 22:08:00 +08:00
    第一个好像是我记得上学的时候学 C 的时候的作业的变形版。
    KomiSans
        5
    KomiSans  
    OP
       2021-02-21 22:47:24 +08:00 via Android
    @Sunyanzi 神人啊,说老实话我也不大能看懂你的写法,从 f 变量就没太看明白,但是你写的代码比我简化了不少
    lecher
        6
    lecher  
       2021-02-21 23:18:10 +08:00   ❤️ 2
    不考虑解法,这三道题考察的是应届生水平。
    初筛的标准可以猜测是:
    1. 具备基本的 java 语法基础
    2. 具备基本的 sql 查询和联表基础

    可以说是很简单的题目了,考察到的知识点有这几个
    1. java 的循环,双重循环,知道找规律,星号和空格的等差数列规则,知道从循环剥离计算规则和打印的处理封装估计会加分。
    2. 知道查询的写法,知道 order by,知道 limit,知道子查询,知道如何优化子查询会加分
    3. 知道联表的写法,知道 group by,知道子查询,知道如何优化联表会加分

    大致就这些,这算是很务实的笔试题了,考察的都是基本知识点。
    Sunyanzi
        7
    Sunyanzi  
       2021-02-21 23:21:59 +08:00   ❤️ 1
    @KomiSans f 求的是初始状态左上角空格的数量 ... 即从最顶端到最长一行的距离 ...

    从下面的代码也可以看到 ... 实际打印的空格数量在变量 c 里 ... 随循环逐级递减再递增 ...

    f 的另一种等效的写法是 int f = 0 - (int)( 2 - Math.sqrt( 4 + 8 * ( n - 1 ) ) ) / 4 ...

    个人感觉没有我现在的版本好看 ... 就没选这个写法 ...

    以及神人不敢当 ... 九年义务教育学以致用而已 ...
    copper20
        8
    copper20  
       2021-02-21 23:24:58 +08:00   ❤️ 1
    第一题主要还是找规律吧,我吃饱了没事也稍微讲一下我的想法吧,思路和 @Sunyanzi 是一样的应该。

    算法的核心还是在找到需要打印的菱形。

    有 i + 1 行的菱形所需要的 ‘*’ 的数量是:当中哪那一行 ‘*’ 的数量 + 2 * 第一行到当中那一行 ‘*’ 数量的和,也就是 (2i+1) + (1 + 3 + ... + 2i - 1),化简一下就是 2i^2 + 2i + 1 。

    所以问题就变成了求使 2i^2 + 2i + 1 <= N (i >= 0) 成立的所有 i 中最大的那一个整数。用高中知识就能知道 f(i) = 2i^2 + 2i + 1 - N 在 i >= 0, N >= 0 的时候是单调增且必有一个非负解的,所以 f(i) = 0 的那个非负解的下取整就是所求的解,也就是我们要找的菱形的行数。

    接下来就是大一 C 语言课上的打印菱形了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5436 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:09 · PVG 16:09 · LAX 01:09 · JFK 04:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.