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 ),然后打印
|
2
KomiSans OP @jworg 我这个主要是从最小的那个中间的点数开始算,一点点扩展成菱形,把数量离着给定数值最近的那个获取就好,所以点数是递增 2 的
|
3
Sunyanzi 2021-02-21 22:01:31 +08:00 3
第一题还挺有趣的 ... 但我没看懂你的写法 ... 我吃饱了也没事自己写了一版如下 ...
i.imgur.com/nYGhFDJ.png 打菱形的过程随便写的 ... 直觉觉得还有优化空间 ... 但不在核心算法里我就懒得做了 ... 以及最后算总量的那个 u 其实也可以套公式求 ... 但我想来想去感觉还是直接累加比较容易就累加了 ... 供参考 ... |
4
young1lin 2021-02-21 22:08:00 +08:00
第一个好像是我记得上学的时候学 C 的时候的作业的变形版。
|
5
KomiSans OP @Sunyanzi 神人啊,说老实话我也不大能看懂你的写法,从 f 变量就没太看明白,但是你写的代码比我简化了不少
|
6
lecher 2021-02-21 23:18:10 +08:00 2
不考虑解法,这三道题考察的是应届生水平。
初筛的标准可以猜测是: 1. 具备基本的 java 语法基础 2. 具备基本的 sql 查询和联表基础 可以说是很简单的题目了,考察到的知识点有这几个 1. java 的循环,双重循环,知道找规律,星号和空格的等差数列规则,知道从循环剥离计算规则和打印的处理封装估计会加分。 2. 知道查询的写法,知道 order by,知道 limit,知道子查询,知道如何优化子查询会加分 3. 知道联表的写法,知道 group by,知道子查询,知道如何优化联表会加分 大致就这些,这算是很务实的笔试题了,考察的都是基本知识点。 |
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 ... 个人感觉没有我现在的版本好看 ... 就没选这个写法 ... 以及神人不敢当 ... 九年义务教育学以致用而已 ... |
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 语言课上的打印菱形了。 |