java的chars()流如何与reduce一起工作?它使用字符编码吗?
在代码战中,计算一个Long的各个整数相乘多少次才能变成一个位数是一个挑战。比如
39->;3*9=27->;2*7=14->;1*4=4//答案是3
以下是发布的解决方案之一-
class Persist {
public static int persistence(long n) {
int times = 0;
while (n >= 10) {
n = Long.toString(n).chars().reduce(1, (r, i) -> r * (i - '0'));
times++;
}
return times;
}
}
我对代码中的“(I-‘0’)部分感到非常困惑。我昨天刚刚了解到,Java的chars()方法返回一个IntStream,它表示字符,因此立即使用reduce对我来说是有意义的。但是它减去了一个字符,这让我很反感,因为它似乎适用于字符,但是它们是如何相乘的呢
我复制了上面的代码,然后删除了字符减法,这是我理解的一个简单的reduce语句,也就是
n = Long.toString(n).chars().reduce(1, (r, i) -> r * i);
然后运行调试器。第一个循环计算出3*9为2907。这个答案来自哪里?我最好的猜测是它与字符编码有关,但为什么减去字符“0”可以解决这个问题呢
# 1 楼答案
A} 到^{} 范围内的一个数字,在打印或连接到字符串时具有特殊意义
char
只是^{你写起来很容易
而且
两个变量都指向同一个数字,因此
将打印
true
但当您执行不同的变量类型将导致选择不同的方法,并对值进行不同的解释
您可以使用
char
值进行计算,并始终将它们分配给int
变量,因为它们的值范围适合int
值范围,因此可以使用IntStream
处理char
值序列,并保存另一个专用流类的创建。您只需注意正确解释结果值说到编码,
char
被定义为UTF-16单元,所以如果你想给它起个名字,那就是正确的对于你问题的例子,关键是要知道字符
'0'
到'9'
在UTF-16编码中有相邻的值(它适用于所有Unicode编码),所以不仅从'0'
减去'0'
得到int
值0
,从'0'
到'9'
范围内的任何字符中减去'0'
将得到相应的int
值。'0'
的编码值为48
这一事实甚至与此逻辑无关请注意^{} 方法的存在,它返回^{cd2>}到^{} (^{}) 范围内的Unicode code point值序列。对于BMP中的字符,值与
char
值相同,但BMP之外的值被编码为两个UTF-16单元,因此更容易用codepoints()
流处理它们