自己上班期间答的机试题,写的不是很好,公司在上海。如图
后面两张是我自己答的,在最后 txt 发给他告诉他答完了之后就没再理我,可能是已经满了,也可能是我答的太烂了
后面两张是我自己答的,在最后 txt 发给他告诉他答完了之后就没再理我,可能是已经满了,也可能是我答的太烂了
i.imgur.com/nYGhFDJ.png
打菱形的过程随便写的 … 直觉觉得还有优化空间 … 但不在核心算法里我就懒得做了 …
以及最后算总量的那个 u 其实也可以套公式求 … 但我想来想去感觉还是直接累加比较容易就累加了 …
供参考 …
可以说是很简单的题目了,考察到的知识点有这几个
1. java 的循环,双重循环,知道找规律,星号和空格的等差数列规则,知道从循环剥离计算规则和打印的处理封装估计会加分。
2. 知道查询的写法,知道 order by,知道 limit,知道子查询,知道如何优化子查询会加分
3. 知道联表的写法,知道 group by,知道子查询,知道如何优化联表会加分
大致就这些,这算是很务实的笔试题了,考察的都是基本知识点。
从下面的代码也可以看到 … 实际打印的空格数量在变量 c 里 … 随循环逐级递减再递增 …
f 的另一种等效的写法是 int f = 0 – (int)( 2 – Math.sqrt( 4 + 8 * ( n – 1 ) ) ) / 4 …
个人感觉没有我现在的版本好看 … 就没选这个写法 …
以及神人不敢当 … 九年义务教育学以致用而已 …
算法的核心还是在找到需要打印的菱形。
有 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 语言课上的打印菱形了。