针对字符串中字符频率的优化计数器

时间:2019-06-29 19:01:36

标签: python string algorithm time-complexity

我正在解决this这个问题,该问题要求在对第6行进行操作之后计算字符串中的'a'数量。

我想出的解决方案是:

s='abcac'
n=52
x=n//len(s)
y=n%len(s)
k=s[:y]
s=(s*x)+k
from collections import Counter
print(s.count('a'))

-非常简单明了。但是当n为大数(例如1000000000000)时,会产生错误。

我如何优化解决方案? 提前致谢 。

3 个答案:

答案 0 :(得分:2)

您不需要构建扩展字符串。首先,计算适合n个字符的字符串的完整重复次数:n//len(s)。然后将此计数乘以字符串中“ a”的数量。一旦有了,就只需要弄清楚需要多少字符串来覆盖其余n个字符:n%len(s),并计算该子字符串中“ a”的数目:

因此,结果将简单地是:

 n//len(s)*s.count("a") + s[:n%len(s)].count("a")

答案 1 :(得分:1)

您提到“当n为大数(例如1000000000000)时,它将产生错误”。让我们看看我们在用n ...

变量uint32_t textureCount = scene->mMaterials[i]->GetTextureCount(aiTextureType_DIFFUSE); for (uint32_t c = 0; c < textureCount ; c++) { scene->mMaterials[i]->GetTexture(aiTextureType_DIFFUSE, c, &texturefile); std::cout << "\n textureFile : " << texturefile.C_Str() << std::endl; std::cout <<"\nTextura : "<< scene->mTextures[atoi(texturefile.C_Str())]<<std::endl; aiTexture *texture = scene->mTextures[atoi(texturefile.C_Str())]; int w = texture->mWidth; int h = texture->mHeight; if (texture == NULL) { std::cout << "\n TextureNull\n"; } else { std::cout << "\n textureNotNull\n"; } uint32_t *data = reinterpret_cast<uint32_t* >(texture->pcData); createTextureImage(data, w, h, materials[i].texturesImages[c]); //createTextureImageView(materials[i].texturesImagesViews[c], materials[i].texturesImages[c]); //createTextureSampler(materials[i].texturesSamplers[c]); // void createTextureImage(uint32_t* pixels,int texWidth,int texHeight,VkImage textureImage) { } } 是我们关注的字符数。此外,根据nx = n // len(s)是我们将遇到的字符串x full 重复次数,而s是一个需要照顾任何“剩余” /“溢出”字母。

现在对我来说,一个大的危险信号是y。从语法上讲,这很好-python支持整数乘字符串。但是,让我们看看运行您的代码并使s = (s * x) + k非常大时我的解释器中发生了什么……

n

当我们这样创建一个扩展的字符串时,需要花费内存来存储该字符串-如果字符串的每个字符为1个字节(为简单起见,我们假定仅ASCII字符),则该行需要10 ^ 12或大约1 TB信息!那是不可行的。

我认为这里的挑战是提出一种解决方案,该解决方案不需要您实际制作字符串-在已知字符串的子结构的前提下,可以使用数学方法来计算无限字符串中'a'的数量。

作为参考,这是我的解决方案:

>>> string * 10000000000000000
python(<pid>,<memory-address>) malloc: *** mach_vm_map(size=10000000000004096) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>

请注意,如何计算较小的字符串中a的数目并以此结果为基础,而不是创建巨大的10 ^ 12个字符字符串的大型内存版本。这样,我只是在玩数字而不是巨型字符串。

希望这会有所帮助。

答案 2 :(得分:0)

from collections import Counter
s='a'
n=100000
a=s.count('a')
x=n//len(s)
y=n%len(s)
k=s[:y]
b=k.count('a')
#s=(s*x)+k
print((a*x)+b)

我将代码更改为此,并且成功了。非常感谢大家的帮助。

很明显的解决办法,我以某种方式错过了。