我正在解决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)时,会产生错误。
我如何优化解决方案? 提前致谢 。
答案 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) {
}
}
是我们关注的字符数。此外,根据n
,x = 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)
我将代码更改为此,并且成功了。非常感谢大家的帮助。
很明显的解决办法,我以某种方式错过了。