有這麼一個有趣的問題,問: 有這麼一個不重覆的自然數數組,自然數長度為N,而數組長度為N 2,依次隨機把自然數放進數組中,請找出2個沒有被放進去的自然數。 例如:這個自然數數組是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]這十個數,某次隨機放入的順序是[2, 1, 3, 5, 7, ...
有這麼一個有趣的問題,問:
有這麼一個不重覆的自然數數組,自然數長度為N,而數組長度為N-2,依次隨機把自然數放進數組中,請找出2個沒有被放進去的自然數。
例如:這個自然數數組是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]這十個數,某次隨機放入的順序是[2, 1, 3, 5, 7, 9, 0, 4],那麼6和8這兩個數沒有被放入進來。
有兩個思路可以解決這個問題
桶排序解決
桶排序的思路是:假設鍵值的範圍是從0到N-1,我們需要標記為0,1,2...N-1的桶。如果元素的鍵值是i,那麼就將該元素放入桶i中。每個桶中的都存在和鍵值具有相同值的元素。
這道題目有10個自然數需要10個桶,遍歷這個數組,數組值為桶的下標,並且將值加1。最後查看桶號,哪號桶為空(值為0)則為沒有放進的自然數。
public class Ziranshu {
public static void main(String[] args) {
int[] a = {2, 1, 3, 5, 7, 9, 0, 4};
int[] tong = new int[10];
for(int i = 0; i < a.length; i++) {
tong[a[i]] = 1;
}
for(int i = 0; i < tong.length; i++) {
if(tong[i] == 0) {
System.out.println(i);
}
}
}
}
利用Set不重覆屬性解決
Set具有無序不重覆的屬性,當然如果你想排下序,可以用TreeSet。思路就是把8個元素一次放進set,然後再向已經存在的這個長度為8的set添加元素,元素值就是0-9之間的這十個數字,如果set中已經存在值,則size()長度不會被改變,否則size()加1.如果長度改變,則列印出當前添加的數字。
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class Ziranshu1 {
public static void main(String[] args) {
int[] a = {2, 1, 3, 5, 7, 9, 0, 4};
Set<Integer> numbers = new TreeSet<Integer>();
for(int i = 0; i < a.length; i++) {
numbers.add(a[i]);
}
int length = numbers.size();
for(int i = 0; i < 10; i++) {
numbers.add(i);
if(length != numbers.size()) {
length = numbers.size();
System.out.println(i + "不在內");
}
}
}
}