我有一个工作示例来打印唯一数字(即,123有唯一的数字,但是11没有')
以下是代码
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter any number : ");
int n = Integer.parseInt(br.readLine());
double val = Math.pow(10, n);
List<Integer> list = new ArrayList<>();
for(int k=1;k<=val;k++){
String s = Integer.toString(k);
if(s.length() == 1){
list.add(k);
} else{
int l = s.length();
int flag = 0;
for (int i = 0; i < l - 1; i++) {
for (int j = i + 1; j < l; j++) {
if (s.charAt(i) == s.charAt(j)) {
flag = 1;
break;
}
}
} if(flag == 0){
list.add(k);
}
}
}
System.out.println(list);
如何使用java8高效编写上述代码?
答案 0 :(得分:7)
可以改写为下一个:
List<Integer> list = IntStream.range(1, (int) val + 1)
.filter(
i -> Integer.toString(i).chars().distinct().count() == Integer.toString(i).length()
)
.boxed()
.collect(Collectors.toList());
答案 1 :(得分:2)
由于你唯一的目标是用尽可能少的代码行来实现结果,所以这可能是获胜的组合:
int val = 2; //set your input parameter any way you want, then
做一些难以理解的扭曲解决方案只是为了拥有单线解决方案:
LongStream.iterate(1, i -> i + 1).limit(Double.valueOf(Math.pow(10, val)).longValue()).filter((value) -> Arrays.stream(Long.valueOf(value).toString().split("")).distinct().count() == Arrays.stream(Long.valueOf(value).toString().split("")).count()).forEach(System.out::println);
答案 2 :(得分:0)
你的方式很好。我能想到你唯一能想到的另一种真正的方法就是首先对字符串进行排序,然后成对比较
因此数字1436将排序为1346,然后您将比较1,3 3,4和4,6并找不到重复的数字。
效率方面,这可以在大约O(nlogn)时间内完成,而不是你当前的O(n ^ 2)时间