面試題:
已知有一長度為100的無序隨機整型數組,且數值範圍是[1,100],寫一演算法,判斷數組中是否有存在重複值,要求,不得嵌套迴圈,不得使用遞迴。
方法一:
1public bool CheckRepeat(int [] a)
2{
3 //定義一個數組測試用,思想:數組的下標和值都是上一個數組元素中的值
4 int [] array = new int [101] ;
5 //將數組的值都複製到測試數組中
6 for (int i = 0;i < 100;i ++)
7 {
8 int a = a [i];
9 array [a] = a; //或者 Array[a]=任何非零的數字,做標誌用。
10 }
11
12 //如果數組沒有重複,則會填滿測試數組,否則數組中將出現自動初始化的值
13 for (int i = 1; i <101 ;i ++)
14 {
15 //判斷如果數組中有自動初始的值,則數組沒有被填滿
16 if (array [i] == 0 )
17 {
18 return false;
19 }
20 }
21 return true;
22}
上述方法收集自網路,這個方法寫的很巧妙,思路也很清晰,但看起來還是有些多餘代碼,儘管滿足了題目要求,只使用了一重迴圈,但演算法中使用了兩個迴圈進行判斷,感覺還不夠簡潔,下面改造演算法為一個單迴圈:
方法二:
1public bool CheckRepeat(int [] a)
2{
3 int [] array = new int [101] ;//數組元素值初始化預設為0
4 for (int i = 0;i < 100;i ++)
5 {
6 int a = a [i];
7 if(array[a]!=0) //說明此元素已經賦過值了,即發生了重複
8 return true;
9 else
10 array [a] = 1; //做標誌用,也可賦任何不為0的數
11 }
12 return false;
13}
轉自:http://www.cnblogs.com/SuperSun/archive/2009/03/06/1404513.html