【刷题日记】2028. 找出缺失的观测数据
本次刷题日记的第 12 篇,力扣题为:2028. 找出缺失的观测数据赛 ,中等
一、题目描述:
稍微看完题目,第一反应,这是一个数学题,实际仔细看完之后,这确实又是一个数学题,只是需要我们用编程的方式来实现而已 , 那我们一起来分析一下
二、思路分析:
1、这道题考察了什么思想?你的思路是什么?
按照题目中给出的信息,我们可以知道有这些重要的点:
- 给出的 rolls 数组中的元素和我们需要补充的元素数据范围都是 1 - 6
- 现在我们是知道平均值 mean,知道 n+m 的数量,来计算丢失的数据,也可以是找到整个观测数据
- 找出 n 对应的数组,可能会有很多个版本,我们只需要输出一个版本就可以了
我们可以按照示例来推理一下:
示例:rolls = [1,5,6], mean = 3, n = 4
根据上述的模拟,我们知道,核心点就是计算能给到 n 个数字的总和 remainSum ,如果 remainSum 小于 n 或者 remainSum 大于 6*n ,则是不满足我们题意的
当得到符合要求的 remainSum 时,我们就可以来分配 n 个数字对应的值了,分配的逻辑也是很简单的
当得到符合要求的 remainSum 时 , remainSum /n 一定是 小于等于 6 的,且如果是等于的情况,一定是没有余数的
则,我们的分配原则就是,将 remainSum % n 得到的余数,分成多分追加到每一个平均数上即可
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码,就按照咱们数学的方式来处理即可
编码如下:
func missingRolls(rolls []int, mean int, n int) []int { remainSum := mean * (len(rolls) + n ) for _,num := range rolls { remainSum = remainSum - num } // 如果剩余的数据不在 n - 6*n 之间,那么就是找不到缺失的数据 if remainSum < n || remainSum > 6 * n { return nil } // 开始构造数据,此处的 remainSum 一定在 n - 6*n 之间 , 则 remainSum / n 一定是 shang 小于 6 ,再加上 yushu // 则我们可以构造这么一个版本:yushu 个 shang+1 , 和 (n-yushu)个 shang 即可 shang,yushu := remainSum/n , remainSum %n res := make([]int, n) for i:=0;i<n;i++{ res[i] = shang if i < yushu{ res[i]++ } } return res }
实际编码也确实是对于上面思想的翻译,翻译出来的代码如上,主要是要考虑好 n 中能承载的数据范围,以及如何去分配 n 个数据的值
四、总结:
不难理解,此处我们的循环是 n+m ,因此时间复杂度是 O(n+m) , 空间复杂度是 O(1)
原题地址:2028. 找出缺失的观测数据
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~