此代码不会编译:
public int trailingZeroes(int n) {
return IntStream.rangeClosed(1,n)
.filter(e -> (e % 5) == 0)
.count();
}
我注意到在返回类型的IntStream
方法有区别的:
int sum()
VS long count()
当试图从计数操作返回int
类型上面,
count()
返回长,但为什么比sum()
count()
返回一个较窄的返回类型?trailingZeroes
方法?因为两个整数的总和是一个int sum
方法返回int
。
对于count
的Javadoc说,这是相当于mapToLong(e -> 1L).sum()
。你可以用它来使自己的计数返回一个int
,就像这样:
return IntStream.rangeClosed(1,n)
.filter(e -> (e % 5) == 0)
.map(e -> 1)
.sum();
或者,因为你根本不知道你的回答将适合在int
反正,只投它:
return (int) IntStream.rangeClosed(1,n)
.filter(e -> (e % 5) == 0)
.count();
我已经明白,为什么数()返回一个长,但为什么总和()返回一个更窄的返回类型比count()?
sum()
返回流中的项目的总和,所以返回的类型流的类型相匹配。 LongStream.sum()
返回long
。
该count()
没有直接关系,从流来的对象的类型,并与他们选择的Stream
类long
的其余部分,表示最大尺寸的类型一致。该count()
方法是在Stream
界面水平,然后将其通过BaseStream
扩展实际上被定义,并随后通过IntStream
,因此该方法的签名的合同必须被保留。 (理想情况下count()
应返回unsigned
,但Java不支持unsigned
。)
什么是达到我想要在我的trailingZeroes方法做了最好的方法是什么?
尚不清楚你想要达到的目的。但我看没有什么特别的毛病。
如果你希望它返回int
,返回之前投的价值。我想你知道,结果始终符合安全地在int
(结果将永远是小于n
这是一个int
),除非你想改变你的方法long
的返回类型。
在另一方面不明白这是什么方法应该做的事情。你可能只是做:
public int trailingZeroes(int n) {
return n / 5;
}
如果你正在寻找一种数学方法来确定有多少尾随0
s有一个整数,这将是不同的。你已经有一个建议的答案,所以服用冒昧地建议为它的乐趣递归的解决方案:
public int trailingZeroes(int n) {
return (n % 10 != 0)
? 0
: 1 + trailingZeroes(n / 10);
}
COUNT()返回一个长,但为什么有总和()返回一个更窄的返回类型比count()?
从的Javadoc,IntStream.count
恰好是减少的特殊情况
return mapToLong(e -> 1L).sum();
这就是为什么它返回一个long
。另外IntStream.sum
又是内部使用Integer.sum
特别降价
return reduce(0, Integer::sum) // signature of sum being 'int sum(int a, int b)'
这就是为什么它返回一个int
。
什么是达到我想要在我的trailingZeroes方法做了最好的方法是什么?
相对于其他的解决方案有轻微的优化,你可以只map
的使用方法:
public int trailingZeroes(int n) {
return IntStream.rangeClosed(1, n)
.map(e -> (e % 5) == 0 ? 1 : 0)
.sum();
}
从方法的名字,你应该寻找在你的执行应推断:
public int trailingZeroes(int n) {
int count = 0;
while (n % 10 == 0) {
count++;
n = n / 10;
}
return count;
}
其中,当在Java的语法9代表应是这样的:
public int trailingZeroes(int n) {
return (int) IntStream.iterate(n, i -> i % 10 == 0, i -> i / 10).count();
}
sum()
返回元素的总和在此流因为你使用IntStream
,sum()
均返回int类型。注:sum()
方法LongStream
将返回long
类型。
要获得int
你可以使用铸造:
return (int)IntStream.rangeClosed(1,n)
.filter(e -> (e % 5) == 0)
.count();