原地址:http://blog.chinaunix.net/uid-92989-id-2005437.html
PS:鉴于以前某人说用int存储数组就是用了O(N)的辅助空间,现在假设是用char存储数组
#include <stdio.h>
#include <stdlib.h>
int GetTheExtraVal(char*var,int size)
{
int val;
int i=0;
for(;i<size;++i)
{
if(var[var[i]&0x7F]&0x80)//字节最高位先前已经被置为1,说明脚标对应的数字重复
{
val=var[i]&0x7F; //取出重复的数
break;
}
var[var[i]&0x7F]|=0x80;//将字节最高位置为1
}
for(;i>=0;--i)
{
var[var[i]&0x7F]&=0x7F;//把字节最高位置过为1的清零,回到数组原来的状态
}
return val;
}
/*测试程序*/
int main()
{
char num[100];
int i;
for(i=0;i<99;i++)
num[i]=i+1;
num[i]=5;
char dulpval=GetTheExtraVal(num,100);
printf("%d\n",dulpval);
return 0;
}