有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低)

本文介绍了一个使用C语言实现的高效算法,用于在一个整数数组中找出重复的元素。该算法通过对数组元素进行位操作标记已访问状态来检测重复项,并在遍历过程中保持原数组不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原地址: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值