我尝试将字符串拆分为等长子串的数组,我要做的第一件事是计算会有多少个子串。我自己写的时候用下面的第一个表达式。当我检查别人给出的答案时,我看到了第二个,这对我来说不是很明显。实际上我无法弄清楚为什么他们会产生相同的结果,虽然我可以用具体的例子来验证。那么你如何证明它们在产生相同结果方面是等价的呢?
int groups = s.length() % subLen == 0 ? s.length() / subLen : s.length() / subLen + 1;
int groups = (s.length() + subLen - 1) / subLen;
答案 0 :(得分:1)
尝试将s.length()
替换为不同的值,并查看两个计算如何得出各自的结果。
从本质上讲,您的版本会考虑两种处理方式不同的情况,并且正在进行“四舍五入”。明确地在其第二个代码分支中。
第二个版本将sublen-1
添加到原始字符串长度,以便整数除法的舍入/截断到达所有给定值s.length()
的所需结果。
答案 1 :(得分:0)
首先让我们考虑问题的实际上下文,即将字符串(假设其长度为a
)划分为一组长度相等的子字符串,假设长度为b
,然后我们知道a和b的范围应该是a >= b >= 1
。如果c
是整数除法a / b
的结果,它总是向下舍入,而d
是正常除法a / b
的结果,而如果{ {1}}是一个整数,d
对于使a + (b - 1)
更大没有影响,因为只有c
可以将a + b
增加1.但为什么呢必须是c
而不是b - 1
或b - 2
等?因为b - 3
的最小值为1,如果在b
中b - ?
大于1,则?
可能为负值,这意味着b - ?
因为c
至少可以减少1,所以会减少至少1个。如果a
不是整数,那么我们知道d
d == c * b + r
是余数r
。因此(1) 1 <= r <= b - 1
可以写为(a + b - 1) / b
。根据(1)我们有(c * b + r + b - 1) / b
,然后有b <= r + b - 1 <= 2 * (b - 1)
,然后有b <= r + b - 1 < 2 * b
,然后是(c + 1) * b <= a + b - 1 < (c + 2) * b
,这意味着c + 1 <= (a + b - 1) / b < c + 2
会增加1正好除法c
不是整数时。