3 回答

TA貢獻1797條經驗 獲得超6個贊
如果這是一個純粹假設的問題,那么這里是一個關于如何做到這一點的純粹假設的答案:
static int countZeroes(int value) {
if(value == 0) // we need to handle this case explicitly
return 1;
IntStream s = IntStream.iterate(value, v -> v / 10);
return (int) takeWhile(s, v -> v > 0 && v % 10 == 0)
.count();
}
takeWhile它使用在 Java 9 中可用但在 Java 8 中不可用的輔助函數,因此必須像這樣模擬:
// In Java 9 there is a standard takeWhile
// https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#takeWhile-java.util.function.Predicate-
// but in Java 8 I have to emulate it
static IntStream takeWhile(IntStream s, final IntPredicate pr) {
final Spliterator.OfInt origSp = s.spliterator();
Spliterator.OfInt filtered = new Spliterators.AbstractIntSpliterator(origSp.estimateSize(), 0) {
boolean lastPredicate = true;
@Override
public boolean tryAdvance(final IntConsumer action) {
if (!lastPredicate)
return false;
origSp.tryAdvance((int v) -> {
lastPredicate = pr.test(v);
if (lastPredicate) {
action.accept(v);
}
});
return lastPredicate;
}
};
return StreamSupport.intStream(filtered, false);
}
這個想法是
IntStream.iterate(value, v1 -> v1 / 10).takeWhile(v -> v > 0)
應該在末尾一個一個地生成一個切割數字流,然后您可以申請takeWhile(v -> v % 10 == 0).count()計算零的數量,最后您可以將這兩個takeWhiles 合并為一個。

TA貢獻1788條經驗 獲得超4個贊
這是另一種方式:-
private static int countTrailingZeroes(int n) {
int length = n == 0 ? 1 : (int) (Math.log10(n) + 1); //number of digits in n
return IntStream.rangeClosed(0, length)
.map(i -> length - i) //reverse stream
.map(o -> (int) Math.pow(10, o))
.filter(o -> n % o == 0)
.boxed()
.findFirst()
.map(i -> (int) Math.log10(i)) //number of digits minus 1
.orElse(0);
}
@Holger 的編輯:
private static int countTrailingZeroes(int n) {
int length = n == 0 ? 1 : (int) (Math.log10(n) + 1); //number of digits in n
return IntStream.rangeClosed(0, length)
.map(i -> length - i) //reverse stream
.filter(o -> n % (int) Math.pow(10, o) == 0)
.findFirst()
.orElse(0);
}

TA貢獻1850條經驗 獲得超11個贊
考慮到您沒有Java9'takeWhile方法,這也可以解決問題:
static final int[] POWERS_OF_10 = { 1000000000, 100000000, 10000000,
1000000, 100000, 10000, 1000, 100, 10 };
static int trailingZeros(int number) {
return Arrays.stream(POWERS_OF_10) // reversed stream of of 10^n
.map(pow -> number % pow) // stream of rests
.reduce(0, (count, rest) -> (rest == 0) ? count + 1 : 0);
}
添加回答
舉報