關於連續的幾個數中有一個數缺失並一次遍歷找出的問題
問題是:找出連續數所在陣列中重複的那個數(一次遍歷)
先複製一段程式碼,這段程式碼很完好的解決了這個問題。
首先我們定義了一個數組a,裡面放了連續的很多數字,當然越多越好。然後我們再定義一個長度跟a一樣的陣列b,並將其所有元素設定為0.然後我們來遍歷a的陣列,並用a陣列的每一個元素作為b陣列的下標,每次就使這個b陣列對應的元素加1,寫到這裡估計很多人都明白了,因為有個元素是重複的,重複的那個下標肯定是加了兩次,我們只需要找出這個數,便是我們想要得到的結果了。public static void main(String[] args) { int a[] = {1,2,3,4,5,10,7,8,9,11,14,12,13,10,6,15}; int b[]={0}; b = new int[a.length]; int n; for(int i=0;i<a.length;i++) { if(b[a[i]-1]++ >0 ) { n = a[i]; System.out.println(n); break; } } }
看到上面的問題,我們聯想到另一個問題:找出連續陣列中缺失的那個數(一次遍歷)
關於這個問題我可謂是嚼勁腦汁,網上確實很難找到相關演算法,在各種蒐羅後發現自己來了興趣,然後就嘗試各種辦法,基本都遍歷在一次到兩次之間。不知哪時靈光閃過,突然想出一個極其巧妙的辦法。在很晚了都要拿出來與網路好友分享一下我的成果。
int a[] = {1,4,5,3,2,6,7,10,9,11,15,13,12,14};
int sum = 0,min = a.length,max = 0;
for(int i=0;i<a.length;i++)
{
sum = sum+a[i];
if(a[i]>max) max = a[i];
if(a[i]<min) min = a[i];
}
System.out.println((min+max)*(a.length+1)/2-sum);
從程式碼上看比上個問題都簡單,但想的過程可不是那麼容易。這裡簡單介紹一下,因為數字都是連續的,根據我們初中學過的等差數列我做了個求和,因為少一項,所以我們肯定能取出其中的最大最小值,並且能根據陣列來得知等差數列的長度,通過這些資料我們能求出一個和,另外我在遍歷的時候也得到一個和,兩個和相減便得到我們想要的結果。顯而易見,其中一個和裡面缺失了那個資料。