0%

相关的编程题汇总-数学思想

记录了解题中需要用数学思想的题目,这类题目规律最多样。

数学

用 Rand7() 实现 Rand10()

这个题有意思。第一次做很容易想到 rand 用两次然后相加得到1-14范围…这种操作就不是均匀分布了,类似扔筛子。这道题的解法是,将 执行两次 rand7 得到x y 坐标。然后映射。类似 如果 x 坐标和 y坐标是均匀分布,那么x,y构成的格点都是均匀分布的,这样就能得到7*7=49个格点,我们只要ran10 因此可以只用前40个 (对10取余即可)如果不是前40个点,则再投一次坐标(拒绝采样)。当然可以优化,剩下多的8个点其实可以看做 rand8 然后 和 rand7 再组成一个坐标网格….以此重复,使得丢弃的数少,运行效率就高。

image-20210315221237407

39. 数组中出现次数超过一半的数字

66. 构建乘积数组

打乱数组

这个题 主要的思路是 如何用 一定的操作规则 模拟 打乱的情景。数组的排列有n!种 那么如何保证等概率的输出一种排序呢?就相当于把数组所有元素放进盒子里,然后无放回抽取出,按抽出的先后顺序即为….

阶乘后的零

这个题 要找规律。首先 阶乘后的0的个数,阶乘后的0能怎么来呢? 例如 1x2x3x4x5x6… 这时候组合一下 1x3x4x6x(2x5) 很明显 10=2x5 所以 就是找结成中有多少个 2x5 的组合 即可。而 2 是每两次至少出现一次 5 大一些 显然出现的次数少 所以就是找有多少个5 像 但是 25 可以算 5x5 75=15x5=3x5x5 可以算有两个5 所以简单的 5 等间隔取肯定是不够的

1 2 3 4 5x1 6 7 8 9 5x2 11 12 13 14 5x3 …. n n/5 之后相当于 获得了 (5x1 5x2 5x3…. 5x5 5x6… 5xn/5) / 5 = 1 2 3 4 … n/5 所以说 n/5之后 又变成了 求 n/5前面有多少个5的问题了。

字符串相乘

使用 字符串 模拟 竖式乘法 呗;类似的还有 字符串加法的题目….

灯泡开关

这个题 以看 测试的 n 10^9 的级别,就肯定是数学找规律的问题。通过归纳总结也能找到规律吧。但是理性分析的话 也是很容易得出结论的。对于第 n 个灯泡的状态,能改变它的只有它的只有 它的 因数轮,例如 36 能被 1 2 3 4 6 | 6 9 12 18 36 注意除了中间的 6 只有一个,其他的都是成对出现了,这就说明 如果 n 恰好能被完全开平方,那么状态切换一定是奇数次,然后第 n 个状态就是亮的,否则如果不能被完全开平方,例如 24 = 1 2 3 8 12 24 因数一定是偶数个,最后第24个状态就是灭的状态,同时24轮及其以后都碰不到它了。所以….