我解决了代码战的任务,看起来像这样:
写一个具有正参数num的函数,持久性并返回其乘法持久性,即您必须将num中的数字相乘,直到达到单个数字。
例如:
persistence(39) == 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
// and 4 has only one digit
persistence(999) == 4 // because 9*9*9 = 729, 7*2*9 = 126,
// 1*2*6 = 12, and finally 1*2 = 2
persistence(4) == 0 // because 4 is already a one-digit number
解决此问题后,我找到了其他解决方案:
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;
}
}
它正在工作,但是为什么我们必须做:-reduce中的'0'?
i - '0'
是将ASCII(或类似)数字的值转换为实际数字的常见技巧。例如,'5'
的编码实际上不是5
,而是其他一些值(我认为是53或ASCII中的某个值)。但是在大多数系统中,'5'
的编码比'0'
的编码大5倍。因此,从字符“ 5”的编码中减去'0'
的值(字符“ 0”的编码)将得到数值为5。
通常,这是一种将代表数字(如char
)的int
(或类似您的代码位char ch = '3';
,如带有代码点的代码)转换为int
的方法,该数字将持有与该数字对应的数字(此处为int num = 3;
)。
char
类型的变量实际上不保存字符的图形表示,但是它保存与Unicode表中该字符的位置/索引对应的数字。例如,小写字母"a"
被放置在索引97处,并且该值"a"
将保留在其16个字节中(因为这是char ch = 'a';
类型的大小)。
由于[char
包含数字,我们被允许使用对数字进行运算的运算符,例如char
和+
。这意味着我们可以编写类似于-
的代码,该代码将作为'b' - 'a'
执行并得到整数97 - 96
。我们也可以使用1
或int - char
,因为这两种格式都将转换为char - int
(int - int
将转换为char
)并返回int
,它表示这些字符之间的距离 。
int
背后的主要思想。我们知道在Unicode表中将数字放置在某处(我们不希望确切地知道位置)的顺序是... 0 1 2 3 4 5 6 7 8 9 ....(还有他们之间没有字符)。
这使我们可以确定
i - '0'
将返回0,'9' - '9'
将返回1,'9' - '8'
将返回2,'9' - '7'
将返回9,'9' - '0'
将返回8,'8' - '0'
将返回7,'7' - '0'
将返回1,'1' - '0'
将返回0。简而言之,'0' - '0'
给我们indexOfNumberN - indexOfZero
的值为int
。
为了避免此类混乱的代码,您可以将lambda重写为更具可读性的形式
NumberN