2575. Find the Divisibility Array of a String

题目 #

You are given a 0-indexed string word of length n consisting of digits, and a positive integer m.

The divisibility array div of word is an integer array of length n such that:

  • div[i] = 1 if the numeric value of word[0,…,i] is divisible by m, or
  • div[i] = 0 otherwise.

Return the divisibility array of word.

Example 1:

Input: word = "998244353", m = 3
Output: [1,1,0,0,0,1,1,0,0]
Explanation: There are only 4 prefixes that are divisible by 3: "9", "99", "998244", and "9982443".

Example 2:

Input: word = "1010", m = 10
Output: [0,1,0,1]
Explanation: There are only 2 prefixes that are divisible by 10: "10", and "1010".

Constraints:

  • $1 <= n <= 10^5$
  • word.length == n
  • word consists of digits from 0 to 9
  • $1 <= m <= 10^9$

思路1 #

分析 #

  • 因为位数不确定,基本可以确定一定会超过64位长度
  • 那么分析一下在某个下标下,num = x * m + y,下一个下标整体乘10加下一位也就是10x * m + 10y + z,算余数时发现其实是算10y+z对m取余
  • 所以每个循环保留余数即可,余数为0就直接设置成1

代码 #

 1func divisibilityArray(word string, m int) []int {
 2	result := make([]int, len(word))
 3	n := 0
 4	for i, v := range word {
 5		n = n*10 + int(v-'0')
 6		n %= m
 7		if n == 0 {
 8			result[i] = 1
 9		}
10	}
11	return result
12}