【问题标题】:Understanding repetition count in a Python String了解 Python 字符串中的重复计数
【发布时间】:2019-09-19 09:42:53
【问题描述】:

我有这个挑战:Repeated String 来解决。我一直在尝试解决这个挑战,但由于内存故障而失败。我无法解决这种情况,因为 HackerRank 平台不支持我的解决方案。可能是 32 位平台。

我有这个解决方案,它非常适用于长度较小的问题,但我一直在研究这件事以根据更少的内存使用来学习。

我的代码:

def repeatedString(s, n):
   if(s != 'a'):
     return len([x for x in (s*n)[:n] if x == 'a'])

   return n

现在,对于具有非常大长度和字符串的输入,这会引发 Memory Error 错误。

我对此进行了研究,并看到了一些提交,并发现了这一点。

排行榜的正确解决方案:

def repeatedString(s, n):
 L = len(s)
 return (s.count('a') * (n//L) + s[:n % L].count('a'))

就是这样!我对这个解决方案感到非常困惑,以至于我可以弄清楚实际发生了什么以及如何发生。有人可以让我知道上述正确解决方案的工作原理吗?我是 python 新手,并尽我所能在竞争性编码方面有所作为。谢谢!

【问题讨论】:

  • 传递给函数的参数是什么?我猜第一个是字符串,另一个是?
  • 长度。对问题的更多理解,可以参考hackerrank@AkshayNevrekar上的问题链接。

标签: python string


【解决方案1】:

您的函数抛出了内存错误,因为您正在使用输入参数 n 的长度构造一个字符串。

n 可以是 10^12,这会产生一个最大长度为 10000 亿个字母的字符串,这意味着您正在创建的字符串可能具有 1 TB 的内存大小(可能更多取决于关于你的字符串的编码)。

所以必须有另一种方法来计算该大小的字符串中 a 的数量对吗?

是的(这就是正确答案与您的解决方案不同的原因)。


1.首先我们得到输入字符串的长度。

L = len(s)

例如,'abcde' 的长度为 5。


2。然后,我们计算 s 中 'a' 的数量。

s.count('a')

3.接下来,我们想知道在我们到达一个长度为n的字符串之前,s作为一个整体重复了多少次。

(n//L)

// 运算符称为integer division,它产生一个整数。例如 s='abcde' 和 n=14,n//L 等于 2。


4.将 s 中 'a' 的数量乘以 s 可以放入长度为 n 的字符串的次数。

s.count('a') * (n//L)

5.我们几乎完成了,但是对于我们的示例,仍然缺少一些东西。 'abcde' 可以在长度为 n 的字符串中重复两次,但还剩下 4 个字符,在我们的示例中为 'abcd'。

在这里,我们使用s[:n % L] 构造来自s 的剩余字符串,或者在我们的示例中为s[:14 % 5]s[:4],结果为'abcd'

然后我们用s[:n % L].count('a')计算这个字符串中'a'的数量


6.将它们加在一起,我们会在您的答案中得到函数:

def repeatedString(s, n):
    L = len(s)
    return (s.count('a') * (n//L) + s[:n % L].count('a'))

【讨论】:

  • 感谢 Nico,您的简报技巧非常出色。再次感谢:)
  • 别担心!很高兴为您提供帮助
【解决方案2】:

因此,这两种算法之间的主要区别在于,在您的原始算法中,您使用s*n,这实际上会尝试在内存中构建 massive 字符串。这就是您收到内存错误的原因。

第二种算法本质上是说“对于长度为X的字符串s重复到长度Ns将适合MN//X次,可能与@987654328 @ 剩下的(除法余数)。

例如如果您的字符串是 aab (X=3) 并且 N 是 10,那么您知道该字符串将适合 3 次,剩下 1 个字符。

因此,假设 s 中有 2 个字母 a,您知道前 9 个字符中会有 2*3 a。现在你需要处理剩下的部分。最后一个字符(余数)将是s 的第一个字符。

第二种方案中s.count('a') * (n//L) + s[:n % L].count('a')就是这两部分;

s.count('a') * (n//L) - 在我的示例中,这会为您提供 2 * 3

s[:n % L].count('a') - 这给了你“剩余”部分。

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多