亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Java 8 Stream/Lambda 計算整數中尾隨零的數量?

如何使用 Java 8 Stream/Lambda 計算整數中尾隨零的數量?

冉冉說 2022-05-25 16:16:07
如何使用 Java 8 Stream/Lambda 計算整數中尾隨零的數量?基本上邏輯應該是:保持整數除以10余數0(商將提供給下一個除法)并計算出現次數。例如12300 % 10 == 0 true1230 % 10 == 0 true123 % 10 == 0 false回答:2注意:我不想在這里涉及 String :-)
查看完整描述

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 合并為一個。


查看完整回答
反對 回復 2022-05-25
?
尚方寶劍之說

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);

}


查看完整回答
反對 回復 2022-05-25
?
慕蓋茨4494581

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);

}


查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號