Leetcode Single Number III

题意:

        找到数列中只出现一次的两个数,其他数都出现两次。

思路:

        使用哈希表记录数出现的次数,最后找出出现一次的两个数。考虑到数的范围未知,使用了两个哈希表来扩展数的范围。扩展的范围是LCM(a,b)。此题中a=1000,b=999。

以下为代码:

int* singleNumber(int* nums, int numsSize, int* returnSize) {
    int mark1[1000],mark2[1000];
    int i=0,j=0,k=0;
    int* r=(int*)malloc(sizeof(int)*2);
    int nums_h1[numsSize],nums_h2[numsSize];
    int temp1=0,temp2=0;
    for(i=0;i<1000;++i){
        mark1[i]=0;
        mark2[i]=0;
    }
    for(i=0;i<numsSize;++i){
        temp1=nums[i]%1000;
        if(temp1<0){
            temp1+=1000;
        }
        temp2=nums[i]%999;
        if(temp2<0){
            temp2+=999;
        }
        nums_h1[i]=temp1;
        nums_h2[i]=temp2;
        mark1[temp1]++;
        mark2[temp2]++;
    }
    for(i=0;i<1000;++i){
        if(mark1[i]%2==1){
            for(j=0;j<numsSize;++j){
                if(nums_h1[j]==i){
                    temp2=nums[j]%999;
                    if(temp2<0){
                        temp2+=999;
                    }
                    if(mark2[temp2]%2==1){
                        r[k]=nums[j];
                        k++;
                        if(k==3){
                            *returnSize=2;
                            return r;
                        }
                    }
                }
            }
        }
    }
    *returnSize=2;
    return r;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值