algorithm - 优化 Haskell 中无限字符串的过滤
问题描述
我正在解决 HackerRank 中的一个问题,其中我必须计算无限重复序列字符串的'a'
第一个n
元素中的字母数,例如"abc"
对于"abcabcabcabc..."
.
我已经使用列表推导实现了以下功能:
repeatedString s n = length $ [x | x <- take (fromInteger n) (cycle s), x == 'a']
wheres
是重复序列,n
是从无限字符串中获取的元素数。
但是 HackerRank 抱怨说,某些测试没有在时限内执行。
问题是:
- 这里的瓶颈是什么?
- 我怎样才能在类似的场合确定它们?
- 你能指出一种更有效的方法吗?
非常感谢您!
编辑:澄清功能参数。
解决方案
您不需要明确a
计算s的数量。你可以做的是:
- 计算
'a'
s 中的数量c
; - 检查你做了多少次完整的循环
s
(除以n
的长度s
); - 计算在最后一个(不完整的)循环中发出了多少个字符
s
; - 计算该部分中的
'a'
s 数量。 'a'
将完整循环的s个数和不完整循环的s个数相加'a'
。
因此,该程序如下所示:
repeatedString :: String -> Int -> Int
repeatedString s n = (length (filter ('a' ==) s) * div n (length s)) + …
…
您仍然需要填写处理最后一个(不完整)周期的部分。
即使n
很大,算法仍然会在O(|s|)中运行。
推荐阅读
- java - Eclipse Luna 首选项页面上的 PyDev 错误
- python - 绘制对数似然函数作为 theta1 和 theta2 的函数
- laravel - whereHas 和 whereDoesntHave 在 laravel eloquent 中没有按预期工作
- tensorflow - 不允许迭代 `tf.Tensor`:AutoGraph 确实转换了这个函数。这可能表明您正在尝试使用不受支持的功能
- rust - 如何在 Rust 中保存子图像?
- doctrine-orm - Symfony 4 - 如何订购但 DISTINCT 和第二次订购 - Createquerybuilder?
- assembly - 为什么将 init_task 结构地址保存到 arm64 引导代码 __primary_switched 中的 sp_el0?
- python - 如何执行独特的随机函数
- javascript - 我们如何在 ANT D 列中获取/重新呈现异步数据
- spring - 在 Spring Security 中注销后重定向到外部身份验证时出现 Cors 问题