關於連續的幾個數中有一個數缺失並一次遍歷找出的問題

問題是:找出連續數所在數組中重複的那個數(一次遍歷)

先複製一段代碼,這段代碼很完好的解決了這個問題。

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;
		   }   
		}
	}
首先我們定義了一個數組a,裏面放了連續的很多數字,當然越多越好。然後我們再定義一個長度跟a一樣的數組b,並將其所有元素設置爲0.然後我們來遍歷a的數組,並用a數組的每一個元素作爲b數組的下標,每次就使這個b數組對應的元素加1,寫到這裏估計很多人都明白了,因爲有個元素是重複的,重複的那個下標肯定是加了兩次,我們只需要找出這個數,便是我們想要得到的結果了。

看到上面的問題,我們聯想到另一個問題:找出連續數組中缺失的那個數(一次遍歷)

關於這個問題我可謂是嚼勁腦汁,網上確實很難找到相關算法,在各種蒐羅後發現自己來了興趣,然後就嘗試各種辦法,基本都遍歷在一次到兩次之間。不知哪時靈光閃過,突然想出一個極其巧妙的辦法。在很晚了都要拿出來與網絡好友分享一下我的成果。

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);
從代碼上看比上個問題都簡單,但想的過程可不是那麼容易。這裏簡單介紹一下,因爲數字都是連續的,根據我們初中學過的等差數列我做了個求和,因爲少一項,所以我們肯定能取出其中的最大最小值,並且能根據數組來得知等差數列的長度,通過這些數據我們能求出一個和,另外我在遍歷的時候也得到一個和,兩個和相減便得到我們想要的結果。顯而易見,其中一個和裏面缺失了那個數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章