關於出現字符、數字次數的問題

1、查找一個字符串中第一個只出現兩次的字符。

對於這個問題,我們可以考慮用數組—因爲字符的存儲方式是,按數字存儲的,A–z(65–122); 每存儲一個就記錄其個數,最後比較每個字符出現的個數可以求出哪個字符出現過兩次;

#include <stdio.h>
#include<stdlib.h>

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》上面的思想最優,我就不照搬了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章