[英]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.