簡體   English   中英

如何反轉整數的數字?

[英]How to reverse digits of integer?

public static int reverse(int n) {
    int result = 0;
    while (n > 0) {
        result = result * 10 + n % 10;
        n = n / 10;
    }
    return result;
}

我正在嘗試反轉整數的數字。 除了像我所做的那樣執行代碼之外,還有其他方法可以做到嗎? 我可以使用 java 流來反轉它嗎?

另一種方式是

int digits = 12345;
StringBuilder buf = new StringBuilder(String.valueOf(digits));
System.out.println(buf.reverse());
System.out.println(Integer.valueOf(buf.toString()));

好的,這是一個有趣的IntStream實現:

public static int reverse (int n) {
     return IntStream.iterate (n, i -> i/10) // produces a infinite IntStream of n, n/10, 
                                             // n/100, ...
                     .limit(10) // 10 elements are sufficient, since int has <= 10 digits
                     .filter (i -> i > 0) // remove any trailing 0 elements
                     .map(i -> i % 10) // produce an IntStream of the digits in reversed 
                                       // order
                     .reduce (0, (r,i) -> r*10 + i); // reduce the reversed digits back
                                                     // to an int
}

例如,對於輸入 123456789,它將首先生成無限的IntStream

123456789,12345678,1234567,123456,12345,1234,123,12,1,0,0,...

在限制為 10 個元素並刪除 0 之后,我們剩下:

123456789,12345678,1234567,123456,12345,1234,123,12,1

在將每個元素映射到它的最后一位之后,我們得到:

9,8,7,6,5,4,3,2,1

現在我們只需要以類似於您在問題中所做的方式減少IntStream - 將每個元素添加到乘以 10 的中間結果:

((((0 * 10 + 9) * 10 + 8) * 10 + 7) * 10 ....) * 10 + 1

請注意,如果輸入的數字有 10 位且最后一位 > 1,則反轉結果將溢出。

它也不支持負輸入。

一個Stream解決方案,它為給定的數字返回反轉的String

int n = 10101010;
String reveresed = String.valueOf(n)
        .chars()
        .mapToObj(Character::getNumericValue)
        .reduce("", (l, r) -> r + l, (l, r) -> l + r);
System.out.println(reveresed); // 01010101

如果我們將反轉的String轉換為Integer並打印它,我們將丟失前導零:

System.out.println(Integer.valueOf(reveresed).toString()); // 1010101

另一個流和數學有趣的實現。

public static long reverse(int n) {
    return Stream.iterate(
            Map.entry(0, n % 10),
            entry -> Math.pow(10, entry.getKey()) <= n,
            entry -> Map.entry(entry.getKey() + 1,
                    (int) (n % (int) Math.pow(10, entry.getKey() + 2) / Math.pow(10, entry.getKey() + 1))))
            .map(Map.Entry::getValue)
            .map(Integer::longValue)
            .reduce(0L, (r, i) -> r * 10 + i);
}

無論如何,你應該在你的方法中返回 long 。 但 StringBuilder 在這里是最好的。

除了其他答案外,您也可以嘗試此實現。

public class MyStreamReverser {

    public static void main(String[] args) {
        streamApiReverser(-9008);

        // other outputs to test:
        // streamApiReverser(20000090);
        // streamApiReverser(-04);
        // streamApiReverser(39-02);
    }

    private static void streamApiReverser(int n) {
        // produce an array of strings each having one digit
        String[] stringArray = String.valueOf(n).split("\\B");
        Stream<String> stringStream = Arrays.stream(stringArray);
        stringStream.collect(Collectors.toCollection(LinkedList::new))
                .descendingIterator()
                .forEachRemaining(System.out::println);
    }
}

輸出:

8
0
0
-9

注意 - 不能很好地使用前導零。 09不起作用(因為它們被視為八進制),適用於尾隨零,適用於負數(但需要進一步測試)。

反轉整數的一種簡單方法是將其解析為字符串,將其反轉,然后將其解析回整數。

public static int reverse(int num) {
    StringBuffer stringBuffer = new StringBuffer(String.valueOf(num););
    stringBuffer.reverse();
    return Integer.parseInt(stringBuffer.toString());
}

最快的答案是:

  public int reverse(int x) {
    int rev = 0;
    while (x != 0) {
        int pop = x%10;
        x /= 10;
        if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
        if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
        rev = rev*10+pop;
    }
    return rev;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM