节约空间地求余

这个是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;在这个基础上,每一次求余都会将前面可以求余的部分余去,那么两个数字相加的和求余的时候也是同样的,两个数字的可以求余的部分被余去,然后剩下余数。

由此,通过在计算过程中求余,就可以显著减少空间占用。