使用lambda表达式的int回文
Palindrome of int using lambda expression
有没有更好的方法来查找一个整数是回文还是不使用 lambda 表达式。我尝试过类似的方法,它有效但正在寻找更好的方法。
public static boolean isPalindrome(int number) {
return number == IntStream.iterate(number, i -> i / 10)
.map(n -> n % 10)
.limit(String.valueOf(number).length())
.reduce(0, (a, b) -> a = a * 10 + b);
}
有一种更简单的方法来判断一个整数是否为回文,但由于这个问题仅限于使用 lambda 表达式,因此我只会建议改进您当前的解决方案。
不幸的是,对于 JDK-8,您需要使用 limit
来截断无限流。但是,从 JDK-9 开始,有一个带有签名的 iterate 方法:
static <T> Stream<T> iterate(T seed,
Predicate<? super T> hasNext,
UnaryOperator<T> next)
因此,您现在可以:
而不是 .limit(String.valueOf(number).length())
return number == IntStream.iterate(number, n -> n != 0, i -> i / 10)
.map(n -> n % 10)
.reduce(0, (a, b) -> a * 10 + b);
请注意,在 reduce
中执行 a = a * 10 + b
是多余的,因此我已将其更改为 a * 10 + b
,如上所示。
您可以将数字转换为字符串并检查反向字符串是否相等。
return number -> Integer.toString(number)
.equals(new StringBuilder(Integer.toString(number))
.reverse().toString());
或者
return number -> String.valueOf(number).equals(new StringBuilder(String.valueOf(number)).reverse().toString());
如果你有10位数字,你需要比较一半才能知道给定的数字是否是回文。我们将数字转换为字符串,然后将长度除以 2,然后比较左侧字符与右侧字符(意味着第 0 个字符应与最后一个字符匹配,其他索引的方式相同,从左到右比较字符)一旦比较失败我们可以 return false 而不是检查所有其他字符,这样我们就可以减少一半的时间。
int num = 121;
String temp = Integer.toString(num);
boolean val = IntStream.range(0,temp.length()/2).noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length()-i-1));
System.out.println("result "+val);
有没有更好的方法来查找一个整数是回文还是不使用 lambda 表达式。我尝试过类似的方法,它有效但正在寻找更好的方法。
public static boolean isPalindrome(int number) {
return number == IntStream.iterate(number, i -> i / 10)
.map(n -> n % 10)
.limit(String.valueOf(number).length())
.reduce(0, (a, b) -> a = a * 10 + b);
}
有一种更简单的方法来判断一个整数是否为回文,但由于这个问题仅限于使用 lambda 表达式,因此我只会建议改进您当前的解决方案。
不幸的是,对于 JDK-8,您需要使用 limit
来截断无限流。但是,从 JDK-9 开始,有一个带有签名的 iterate 方法:
static <T> Stream<T> iterate(T seed,
Predicate<? super T> hasNext,
UnaryOperator<T> next)
因此,您现在可以:
而不是.limit(String.valueOf(number).length())
return number == IntStream.iterate(number, n -> n != 0, i -> i / 10)
.map(n -> n % 10)
.reduce(0, (a, b) -> a * 10 + b);
请注意,在 reduce
中执行 a = a * 10 + b
是多余的,因此我已将其更改为 a * 10 + b
,如上所示。
您可以将数字转换为字符串并检查反向字符串是否相等。
return number -> Integer.toString(number)
.equals(new StringBuilder(Integer.toString(number))
.reverse().toString());
或者
return number -> String.valueOf(number).equals(new StringBuilder(String.valueOf(number)).reverse().toString());
如果你有10位数字,你需要比较一半才能知道给定的数字是否是回文。我们将数字转换为字符串,然后将长度除以 2,然后比较左侧字符与右侧字符(意味着第 0 个字符应与最后一个字符匹配,其他索引的方式相同,从左到右比较字符)一旦比较失败我们可以 return false 而不是检查所有其他字符,这样我们就可以减少一半的时间。
int num = 121;
String temp = Integer.toString(num);
boolean val = IntStream.range(0,temp.length()/2).noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length()-i-1));
System.out.println("result "+val);