public static int reverse(int n) {
int result = 0;
while (n > 0) {
result = result * 10 + n % 10;
n = n / 10;
}
return result;
}
我正在尝试反转整数。除了执行我做过的代码之外,还有其他方法可以做到吗?我可以使用Java流逆转它吗?
答案 0 :(得分:8)
另一种方式是
int digits = 12345;
StringBuilder buf = new StringBuilder(String.valueOf(digits));
System.out.println(buf.reverse());
System.out.println(Integer.valueOf(buf.toString()));
答案 1 :(得分:7)
好的,这是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,则反转结果将溢出。
它也不支持负输入。
答案 2 :(得分:0)
一种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
答案 3 :(得分:0)
又一个流和Math乐趣实现。
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);
}
无论如何,您应该在方法中返回很长的时间。但是StringBuilder是最好的。
答案 4 :(得分:0)
连同其他答案,您也可以尝试此实现。
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
不起作用(因为它们被视为八进制),可以使用尾随零,应该可以使用负数(但需要进一步测试)。
答案 5 :(得分:0)
反转整数的一种简单方法是将其解析为字符串,将其反转,然后再解析为整数。
Cargo.toml
答案 6 :(得分:0)
最快的答案是:
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;
}