每日一题——找出字符串的可整除数组

92 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天,点击查看活动详情


6368. 找出字符串的可整除数组

给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一个正整数 m 。

word 的 可整除数组 div  是一个长度为 n 的整数数组,并满足:

  • 如果 word[0,...,i] 所表示的 数值 能被 m 整除,div[i] = 1
  • 否则,div[i] = 0

返回 word 的可整除数组。

 

示例 1:

输入: word = "998244353", m = 3
输出: [1,1,0,0,0,1,1,0,0]
解释: 仅有 4 个前缀可以被 3 整除:"9""99""998244""9982443"

示例 2:

输入: word = "1010", m = 10
输出: [0,1,0,1]
解释: 仅有 2 个前缀可以被 10 整除:"10""1010"

 

提示:

  • 1 <= n <= 105
  • word.length == n
  • word 由数字 0 到 9 组成
  • 1 <= m <= 109

思路

这道题目我们首先要解决的问题是如何避免去判断超过 int 范围的值,对于一个超出表示范围的数来说,计算他的取余数是不现实的,故我们需要找到一个方法来将这个数来尽可能的缩小。

对于以某一位结尾的数来说,是与前一位的数有关的,比如,如果 m = 3,要计算取余的数是 41,那么,我们可以先计算高位,先将高位 4 进行取余操作,这样剩下一个 1,末位留下一个 1,我们现在需要计算的是 11 的取余,这样就减少了我们需要计算的数,也就保证了我们计算的数都是在可表示的范围内。

题解

class Solution {
    public int[] divisibilityArray(String word, int m) {
        int n = word.length();
        int[] div = new int[n];
        long num = 0;
        for(int i = 0; i < n; i++) {
            num = num * 10 + (word.charAt(i) - '0');
            num %= m;
            div[i] = num == 0? 1: 0;
        }
        return div;
    }
}

如果你有其他的思路或者更好的解法,亦或者你发现了文章出现了错误或有不足,欢迎在评论区和我交流,我看到了一定会回复。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!