关于出现字符、数字次数的问题

1、查找一个字符串中第一个只出现两次的字符。

对于这个问题,我们可以考虑用数组—因为字符的存储方式是,按数字存储的,A–z(65–122); 每存储一个就记录其个数,最后比较每个字符出现的个数可以求出哪个字符出现过两次;

#include 
#include

char second_char(char* str)
{
    char *p=str;
    unsigned char arr[256]={0};

    while(*p)
    {
        arr[*p]++;
        p++;
    }

    p=str;
    while(*p)
    {
        //比较每个字符出现的个数可以求出哪个字符出现过两次;

        if(arr[*p]==2)
        {   
            return *p;
        }
        p++;
    }
    return -1;
}

比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,

其时间复杂度为O(N),空间复杂度为O(1)

2、一个数组中有一个数字的次数超过了数组的一半,求出这个字符

对于这个问题,我同样也考虑用数组; 每存储一个就记录其个数,最后比较每个字符出现的次数超过了数组的一半;

int  N_of_num(int  *str,int size)
{
     int  *p=str;
     unsigned int  arr[12]={0};
     int length=size;

    while(length)
    {
        arr[*p]++;
        p++;
        length--;
    }

    p=str;

    int L=size/2;

    while(*p)
    {
        if(arr[*p]>=L)
        {   
            return *p;
        }
        p++;
    }
    return NULL;
}

如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。

但是上面这个程序问题很大,它只适合0~9之间的元素,那如果这个元素,大于9 ,怎么办呢?这个程序就会出问题…….

对于这个算法,还是《剑指offer》上面的思想最优,我就不照搬了。

你可能感兴趣的:(C语言)