題目:一個整數數列,元素取值可能是0—65535中的任意一個數,相同數值不會重復出現。0是例外,可以反復出現。
請設計一個算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。
注意:
1、5個數值允許是亂序的。比如: 8 7 5 0 6;
2、0可以通配任意數值。比如:8 7 5 0 6 中的0可以通配成9或者4;
3、0可以多次出現;
4、復雜度如果是O(n2)則不得分。
分析:通過分析你可以發現,題目只要滿足:除0之外的最大數減去除0之外的最小數小於等於4就行了。
故只要通過一個循環就5個數字中除0之外的最大數和最小數。求差之後與4做個比較就行了。偽代碼如下:
1 public boolean isContiguous(int[] array)
2 {
3 int min=-1;
4 int max=-1;
5 for(int i=0;i <array.length;i++)
6 {
7 if(array[i]!=0)
8 {
9 if(min==- 1||min>array[i])
10 {
11 min=array[i];
12 }
13 if(max==-1||max <array[i])
14 {
15 max=array[i];
16 }
17 }
18 }
19 return max-min <=array.length-1;
20 }
下面讓我用WF4.0來實現解這個題目,思路和上面代碼思想是一致的。
流程:
實現:
1、產生隨機數流程GenerateRandom流程,如下圖:
2、驗證產生的數字是否滿足條件:
3、輸出結果:
4、整個流程:
運行結果:
0~65535范圍太大,很難產生出5位連續的數字,將范圍縮小為1-6:
總結:這篇文章主要說明使用WF4.0和你寫一般的C#代碼一樣,復雜的邏輯它也可以實現。一些復雜的算法可能會因為它的可視化編程而 變得更簡單。
本文配套源碼