有序数组中的单一元素
题目描述
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
解题方法
纯粹是为了哈希而哈希。这题哈希绝不是最佳答案!!!代码根据评论改的
struct Linknode
{
int key;
int val;
struct Linknode *next;
};
//创建哈希表
struct hash_table
{
struct Linknode **head;//相当于创建一个多维数组,head是其首地址。
int length; //哈希表的长度。即多维数组的一维长度。
};//此处的分号必须有
//哈希表初始化
int init_hash(struct hash_table *table,int length)
{
if(length<=0) return -1;
struct Linknode ** temp=malloc(sizeof(struct Linknode)*length);
table->head=temp;
memset(table->head,0,length*sizeof(struct Linknode));
if(table->head==NULL) return -1;
table->length=length;
return 0;
}
//释放哈希表
void free_hash(struct hash_table table)
{
int i;
if(table.head!=NULL)
{
for(i=0;i<table.length;i++)
{
while(table.head[i]!=NULL)
{
struct Linknode *temp=table.head[i];
table.head[i]=table.head[i]->next;
free(temp);
}
}
free(table.head);
table.head=NULL;
}
table.length=0;
}
//计算数组中元素的散列位置
int addr(struct hash_table table,int key)
{
int addr;
addr=abs(key)%table.length;
return addr;
}
//将数组元素插入哈希表中
int insert(struct hash_table table,int key,int val)
{
int k=addr(table,key);
struct Linknode * new_node = (struct Linknode *)malloc(sizeof(struct Linknode));//sizeof后必须包含其类型,如int struct,还有linknode与linknode的区别有疑问?
if (new_node==NULL) return -1;
new_node->key= key;
new_node->val=val;
new_node->next=table.head[k];
table.head[k]=new_node;
return 0;
}
//查找哈希表
int search(struct hash_table table,int key,int val)
{
int k=addr(table,key);
struct Linknode *element_head=table.head[k];//一直出错的原因在这里,之前直接用table.head[k].解答出错
while(element_head!=NULL)
{
//if(table.head[k]->key==key) count++;
if(element_head->key==key&&element_head->val!=val) return 0;
element_head=element_head->next;
}
return 1;
}
int singleNonDuplicate(int* nums, int numsSize)
{
int i;
int k;
int result;
struct hash_table table;
init_hash(&table,100);
for(i=0;i<numsSize;i++)
{
insert(table,nums[i],i);
}
for(i=0;i<numsSize;i++)
{
k=search(table,nums[i],i);
if(k==1)
{
result=nums[i];
break;
}
}
free_hash(table);
return result;
}