节约空间地求余
这个是leetcode的2575题。
对于这一道题,固然可以这样来处理cnt的数据:
cnt = cnt *= 10 + num;
但是这么写却又隐患——那就是当遇到特别大,接近long long 的极限的长度的数字的时候,就没有办法再*=10了。
这个文章将给你介绍如何节约空间。
class Solution {
public:
vector<int> divisibilityArray(string word, int m) {
int n = word.size();
vector<int>ans;
long long cnt = 0;
for(auto q:word){
auto num = q -'0';
cnt = (cnt * 10 + num) % m;
if(cnt % m == 0){
ans.emplace(ans.end(),1);
}
else{
ans.emplace(ans.end(),0);
}
}
return ans;
}
};
在运算的途中就将数据给处理了,那么每一次运算的结果都会明显减少,至少不需要再记录那个非常大的数字了。
假如需要更大的数字,那么可以使用数组来处理。
但是在这个时候是用不上的。
为什么可以在计算过程中求余呢?
可以将求余数分为两个部分,一个是可以被求余的,还有一部分是多出来的。假如是可以被求余的数,那么多出来的就是0;在这个基础上,每一次求余都会将前面可以求余的部分余去,那么两个数字相加的和求余的时候也是同样的,两个数字的可以求余的部分被余去,然后剩下余数。
由此,通过在计算过程中求余,就可以显著减少空间占用。