(一)思考思路
例:
一组数据中只有一个数字出现了一次
数据: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>