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

相關推薦

關於連續個數個數缺失的問題

問題是:找出連續數所在陣列中重複的那個數(一次遍歷) 先複製一段程式碼,這段程式碼很完好的解決了這個問題。 public static void main(String[] args) { int a[] = {1,2,3,4,5,10,7,8,9,11,14,12,1

深度優先一個無向圖的環

進行深度優先遍歷的時候,當考察的點的下一個鄰接點是已經被遍歷的點,並且不是自己之前的父親節點的時候,我們就找到了一條逆向邊,因此可以判斷該無向圖中存在環路。 visited陣列記錄了節點的訪問狀態,visited[i] = 0表示節點i尚未被訪問過; visi

陣列個數只出現,其它的數恰好出現兩這三個數

具體的題意如題 當我第一次碰到這類題的時候是宿舍的舍友分享的,當時他說的問題還要簡單一些,具體的題意是"陣列中只有一個數只出現一次,其它的數恰好出現兩次,找出這個數。"  當時我的第一感覺就是要用到快排,因此得出第一種演算法,將陣列進行快排的第一層排序,然後從中間分開,數字

陣列n個數據,要將他們順序迴圈向後移k位,即前面的元素向後移k位

方法一:#include <stdio.h>#include <stdlib.h>int main(){int k,i,n,a[100]={0},b[100]={0};scanf("%d %d",&n,&k);for(i=0;i<

排列組合問題:n個數取k個數

() spa 條件 esp sizeof pac ret emp space /************************************有0~n-1共n個數,從其中任取k個數,*已知這k個數的和能被n整除,求這樣的*k個數的組合的個數sum,*輸入:n,k*

劍指-OFFER_3 java_在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列任意一個重複的數字。

題源:  在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。   例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字

從n個數選擇m個數來 Java實現(順序不固定)

public static List<int[]> collect = new ArrayList<int[]>(); public static void permutation(int[] a, int begin0, int begin,

從n個數選取m個數的所有組合

非遞迴實現: #define N 7 #define M 3 int main() { int array[N] = { 1,2,3,4,5,6 ,7 }; int i, j, k; for (i = 0; i<=N-M; i++) for (j = i +

從N個數取出任意個數,求和為指定值的解

 題目來自CSDN的帖子: 原題是這樣的: 任意給一陣列,如{-10,45,35,99,10,6,9,20,17,18} 再任意給一個值,如35. 請從上面的陣列中找出所有的組合,使他們的和等於35. 例如對於上面的陣列,所有的組合情況為: 35; -10+45; 17+

m個數取n個數的組合

#include <stdio.h> int a[1000]; int end; // 儲存輸入要取的n值 // 從m個數中,取出n個數的組合 void Combination(int

//組合演算法 從M個數取出N個數,無順序

  [self myCombineAlgorithm:MutableArray num:5]; //組合演算法 從M個數中取出N個數,無順序 -(void)myCombineAlgorithm:(NSMutableArray*)src num:(int)getnu

程式設計題:從n個數選取m個數,計算m個數的和s,判斷剩餘n-m個數是否存在等於s的數,如果存在,輸出最大值

描述:從n個數中選取m個數,計算m個數的和s,判斷剩餘n-m個數中是否存在等於s的數,如果存在,輸出最大值。第一行輸入n和m值,第二行輸入n個數,輸出最大值。例如:輸入:6 2          1 2 5 3 7 4輸出:7分析:1+2=3;2+5=7;2+3=5;3+4=

C++排列組合(從N個數選擇M個數的所有情況)

 待選擇的數存放在in矩陣中,矩陣的大小為N,從中選出target=M個數,給出所有可能情況。 思路: in矩陣存放的數為(M=2,N=4): 下標 0 1 2 3 元素 1 2 3 4  定義一個

遞迴實現 從n個數選取m個數的所有組合

有n(n>0)個數,從中選取m(n>m>0)個數,找出所有的組合情況(不分順序)。這樣的組合共有 Cmn=n×(n−1)×⋯×(n−m+1)m!. 一個數組 data 有 n 個元

列印從n個數選取m個數的組合數

   列印從n個數種選取m個數的組合數 方法一:利用遞迴思想。 //從後往前選取,選定位置i後,再在前i-1個裡面選取m-1個。 //如 1 2 3 4 5 中選取 3 個 //1、選取5後,再在前4個裡面選取2個,而前4個裡面選取2個又是一個子問題,遞迴即可。 //2、如

求fibonacci數列前五十個數或者求前50個數的某個數的fibonacci數

求fibonacci數列前五十個數 #include <stdio.h> main() { double fib[51],n; fib[0]=0; fib[1]=1; printf("%16.0lf",fib[1]); f

列印斐波那契數列的前三十個數所有的質數,統計個數

#include<stdio.h> #include<math.h> int main(){long int f1=1,f2=1,i,k,n;long int a[30];int m=0;a[0]=1;a[1]=1;for(i=2;i<=29;

輸出N個數取M個數的所有組合,排列情況

一般思路是由組合算排列,現在藉助Next_permutation函式由排列到組合。 1.組合 讀入一個字串,一個整數n,輸出字串中取n個字元的所有組合情況 演算法:藉助Next_permutation函式,構造一個大小為len=str.length()的陣列,0表示要輸出