@SomeBottleLeetcode每日一题 —— 3756. 连接非零数字并乘以其数字和 II 中发帖

今天可能给一长串字符串,并有多次区间查询,思路上是昨天题的延续。 

思路
看到区间查询能想到前缀和、差分数组和线段树,这题涉及到了区间数字和所以应该能按前缀和去做。
前缀和求区间数字和是老生常谈了,生成前缀和后区间和就是 preSum[r+1]-preSum[l] (这里假设前缀和数组下标全从 1 开始),但是题目还涉及到要把 [l, r] 间的数字拼接成一个数字得到 x。
昨天的题目,我们在按位拼接数字的时候每次迭代会将前一个拼成的数 \times 10 再加上当前数,这题其实也是一样,我们可以递推前缀拼成的数字:
// if s[i]!='0'
preCat[i+1] = preCat[i]*10 + (s[i]-'0')
// else
preCat[i+1] = preCat[i]

可以看到同一个前缀,每一次递推都会 \times 10。能这样递推就可以计算区间结果了...