问题描述
我正在解决this的hackerrank问题,用于计算给定字符串中'a'
的数量。
我的解决方案是将字符串存储在pattern
变量中。尽管pattern
的长度小于n
,但它只会将字符串添加到自身中。然后,我将遍历pattern
并在字符串中添加'a'
的数量。
当n
1000000时,此解决方案可以正常工作。但是再加上一个0,当n
= 10000000
时,我在hackerrank中得到的字符串是RangeError
,因为它太长了。
有没有办法解决这个RangeError
问题?我知道还有其他方法可以解决此问题,但是我只想知道如何编辑代码以使其通过hackerrank测试。
function repeatedString(s,n) {
let pattern = s;
let count = 0;
while (pattern.length < n) {
pattern += pattern;
}
for (let i = 0; i < n; i++) {
if (pattern[i] === 'a') {
count++;
}
}
return count;
}
解决方法
您可以对此进行数学运算,而不是在字符串连接和循环上消耗内存和计算
a
的总数将是a
中s
的数目乘以重复的s
的总长度不超过n
的数目,加上s
的其余部分(左子字符串),它们填充n
例如,使用输入
s = 'aba'
n = 10
可以在下面直观地看到
aba aba aba a(ba)
|______3______| |1|
aba
的前3个重复项等于n
除以s
的长度(即10/3 = 3)
剩余的a
(将bc
跳到与n
相等)是s
的结果,其长度等于n
的余数除以长度s
(即10%3 = 1)
再加上其中两个,我们就会得出结果
numberOfA(s) * (n div len(s)) + numberOfA(substr(s,n mod len(s)))
function repeatedString(s,n) {
const numberOfA = str => str.split('').filter(char => char === 'a').length
return (
numberOfA(s) * Math.floor(n / s.length) +
numberOfA(s.substring(0,n % s.length))
)
}
console.log(repeatedString('aba',10))
console.log(repeatedString('a',1000000000000))
,
php 针对重复字符串的解决方案
function repeatedString($s,$n) {
$len = strlen($s);
$occurence = substr_count($s,"a");
$mul = floor ($n / $len);
$reminder = $n % $len;
$su = substr($s,$reminder);
return ($occurence * $mul) + substr_count($su,"a");
}