1. 程式人生 > >一組資料中只有一個數字出現了一次。 其他所有數字都是成對出現的。請找出這個數字(陣列指標的方法)

一組資料中只有一個數字出現了一次。 其他所有數字都是成對出現的。請找出這個數字(陣列指標的方法)

(一)思考思路

例:

一組資料中只有一個數字出現了一次

資料:arr[]={1 ,3 ,5 ,7, 1, 3, 5}這組資料中,只有7出現了一次。
結構:找到的數就是:7.

1:對於這樣的一個數組,我們應該使用函式呼叫的辦法來實現,使得整個程式清晰可見

2:要找出這樣的數,其實我們可以用傳址的方式來檢驗相同性,即陣列中第 i 個數據與第 i +1 ,i+2 , i+3....i+n-1元素進行比對,每次遇到相同元素(arr[ i ] == arr[ j ]),我們可以將第 i+1 元素和第 j元素進行換位,例如

                          1 3  5  7  1  3  5  

第一次換位        1 1  5  7  3  3  5

          ...........

       對於這樣的換位,實際上在迴圈中每一次 i 的變換隻需要 i =i+ 2就可以了,這樣就可以跳過想通元素,但是會出現問題                  

       對於任意給定的數 key =7,它的放置位置不一樣導致的結果會出現一定的問題,例如

1 1  5   5  7  3  3

       當程式執行到這裡,針對 7 對 後面的元素(3 ,3)進行判斷,那麼沒有一個元素與它相等 ,那麼這個數就是我們想要的,迴圈就沒必要進行下去,return 這個數就OK了

3:注意事項:

     1):利用指標傳址

     2):利用指標進行陣列元素的判斷 

               在一維陣列中*(p+i) *是解引用, *(p+i) 就是arr[ i ]的元素,因為採用的是地址的方式找到arr[ i ]則可對

arr[ i ]進行才做

     3):利用指標輸出想要的元素

  詳情見程式碼實現

(二)程式碼實現

<pre name="code" class="html"><span style="font-size:18px;">
</span><pre name="code" class="html"><span style="font-size:18px;">#include<stdio.h>
int found_number(int *x,int n)
{

	int i=0,temp=0;
	for(i=0;i<n-2;i=i+2)
	{
		int j=i+1;
		for(;j<n;j++)
		{ 
			if(*(x+i)==*(x+j))
			{
            
				 temp=*(x+i+1);
				 *(x+i+1)=*(x+j);
                                 *(x+j)=temp;
				 break;
			}
			if((j==n-1)&&(*(x+i)!=*(x+j)))
			{
				return *(x+i);
			}
	    }
	
	}

    	return *(x+n-1);
}
int main()
{
	int arr[]={2,9,6,5,6,2,5};
	int key=0;
	int *p=arr;
	key=found_number(p,sizeof(arr)/sizeof(arr[0]));
	printf("%d\n",key);
	system("pause");
	return 0;
}</span>