26届中国移动数智化部笔试
25年11月9日下午15:00于深圳出租屋内参加26届中国移动数智化部的笔试
一共两个算法题目,第一个是签到题,不难
第二个题目看着挺花哨,但题意是:给一个数组,求所有两两数字之差的绝对值的和
比如
1 | [4, 2, 0] |
但有时间限制,不能套双循环求,如果用下面的双循环,只能通过50%(会超时)
1 | for i in range(LenData): |
好玩的是,我添加了下面的代码,防止出现[3,3,3,3,3]这种情况,通过率上升到56%
1 | if LenData == 1: |
本题目关键在于,如何不用双循环快速求解
比如输入: [4, 1, 5, 7, 12],为了方便后续观察,我将其先排序
得到[1, 4, 5, 7, 12],随后求两个数之差
得到
| 3 | 4 | 6 | 11 |
|---|---|---|---|
| 1 | 3 | 8 | |
| 2 | 7 | ||
| 5 |
注意,对角线的差值,表示两个相邻元素之差
并且,我们能观察到,1与5的差值,等于1与4的差值加上4与5的差值;1与12的差值等于所有相邻差值相加,于是我们可以得到下表
| 3 | 3+1 | 3+1+2 | 3+1+2+5 |
|---|---|---|---|
| 1 | 1+2 | 1+2+5 | |
| 2 | 2+5 | ||
| 5 |
于是!
1 | 3 * 1*(n-0) + 1 * 2*(n-1) + 2 * 3*(n-2) + 5 * 4*(n-3) |
我们可以得到个公式,令d_i为每个差值
1 | d_i * (i + 1) * (n - i) |
其中i为下标,n为差值数组长度
最后,用一次循环即可得到总的差值和
1 | def main(): |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lthero!
评论





