2016-09-17 79 views
3

我有一個工作示例打印出唯一位數的整數(即123具有獨特的數字,但11不)打印所有從1到10^N具有獨特的數字在它

下面是代碼

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

如何衡量給定的實現是否比另一個更有效? –

+0

在使用java流的有限數量的行中寫入的效率很高 – Digital

回答

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()); 
+0

偉大的,它的工作,一個問題boxed()會在這裏做什麼? – Digital

+3

它是一個IntStream,因此一個原始類型爲int的流,並且您想要一個列表,因此您不能擁有一個列表,您需要先將它們裝箱以獲取Integer –

0

你的方式很好。我唯一能想到的另一種方法就是做到這一點,首先對字符串進行排序,然後對它進行比較

因此數字1436會排序爲1346,然後您可以比較1,3 3, 4和4,6,並找到沒有重複的號碼。

效率聰明一點可以在大約O(nlogn)的時間內完成,而不是你目前爲O(n^2)時間

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);