• 面试编程题(字符串)


    1 字符串转整数

    long long StrToIntCore(const char* str, bool minus);
    
    enum Status {kValid = 0, kInvalid};
    int g_nStatus = kValid;
    
    int StrToInt(const char* str)
    {
        g_nStatus = kInvalid;
        long long num = 0;
    
        if(str != NULL && *str != '') 
        {
            bool minus = false;
            if(*str == '+')
                str ++;
            else if(*str == '-') 
            {
                str ++;
                minus = true;
            }
    
            if(*str != '') 
            {
                num = StrToIntCore(str, minus);
            }
        }
    
        return (int)num;
    }
    
    long long StrToIntCore(const char* digit, bool minus)
    {
        long long num = 0;
    
        while(*digit != '') 
        {
            if(*digit >= '0' && *digit <= '9') 
            {
                int flag = minus ? -1 : 1;
                num = num * 10 + flag * (*digit - '0');
    
                if((!minus && num > 0x7FFFFFFF) 
                    || (minus && num < (signed int)0x80000000))
                {
                    num = 0;
                    break;
                }
    
                digit++;
            }
            else 
            {
                num = 0;
                break;
            }
        }
    
        if(*digit == '') 
        {
            g_nStatus = kValid;
        }
    
        return num;
    }

    2字符串基本操作函数原型

    int strlen(const char * str)
    {
        assert(str!=NULL);
        int len = 0;
        while((*str++) !=‘0’)
            len++;
        return len;
    }
    
    int strcmp(const char* str1,const char* str2)
    {
        assert(str!=NULL && str2!=NULL);
        int ret = 0;
        while(!(ret = *(unsigned char*)str1-*(unsigned char*)str2)&& *str)
        {
            str1++;
            str2++;
        }
        if(ret<0)    ret = -1;
        else if(ret > 0)     ret = 1;
        return     ret;
    }
    char * strcat(char *strDest,const char *strSrc)
    {
        char * address = strDest;
        assert((strDest!=NULL) && (strSrc != NULL));
        while(*strDest)
        {
            strDest++;
        }
        while(*strDest++ = *strSrc++);
        return address;
    }
    char *  strcpy(char* strDest,const char * strSrc)
    {
        assert(strDest!= NULL && strSrc !=NULL);
        char * strD = strDest;
        while((*strDest++=*strSrc++)!='');
        return strD;
    }

    3字符串匹配 KMP

    int kmp_search(const char* src,int slen,const char* patn,int plen,const int * nextval,int pos)
    {
        int i =pos , j=0;
        while(i<slen && j<plen)
        {
            if(j==-1 || src[i]==patn[j]){++i;++j;}
            else
            {
                j = nextval[j];
            }
        }
        if(j>=plen) return i-plen;
        else return -1;
    }
    
    void get_nextval(char const* ptrn,int plen,int *nextval)
    {
        int i = 0;
        nextval[i] = -1;
        int j=-1;
        while(i<plen-1)
        {
            if(j==-1||ptrn[i]==ptrn[j]){++i;++j;nextval[i]=j;}
            else
                j=nextval[j];
         }
    }
    
    //改进
    void get_nextval(char const* ptrn,int plen,int *nextval)
    {
        int i = 0;
        nextval[i] = -1;
        int j=-1;
        while(i<plen-1)
        {
            if(j==-1||ptrn[i]==ptrn[j])
            {
                ++i;
                ++j;
                   if(ptrn[i]!=ptrn[j])
                        nextval[i]=j;
                    else
                        nextval[i]=nextval[j];
            }
            else
                j = nextval[j];
         }
    }
    
    //最基础的BF算法
    char* strFind(const char*str,const char* substr)
    {
        assert(str!=NULL && substr!=NULL );
        int m = strlen(str);
        int n = strlen(substr);
        if(m < n)
            return NULL;
        for(int i=0; i<=m-n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(str[i+j]!=substr[j])
                    break;
            }
            if(j==n)
                return str+i;
        }
        return NULL;
    }

    4 最长回文子串Manacher

    /*最长回文子串长度
    Manacher算法
    */
    void Manacher(char* str)
    {
        int len = strlen(str);
        int i,id,maxid = 0;
        int newstr_len =0;
        newstr[newstr_len++] = '@';    
        for (i = 0; i < len; i++){  
            newstr[newstr_len++] = '#';
            newstr[newstr_len++] = str[i];
        }  
        newstr[newstr_len++] = '#';
        newstr[newstr_len++] = '$';
    
        int * p = new int[newstr_len];
        for(i=1;i<newstr_len-1;i++)
        {
            if(maxid > i)
                p[i] = min(p[2*id-i],maxid-i);
            else
                p[i] = 0;
            while(newstr[i+1+p[i]]==newstr[i-1-p[i]])
                p[i]++;
            if(p[i]+i>maxid)
            {
                maxid = p[i]+i;
                id = i;
            }
        }
        int maxlen = 0;
        int centerIndex = 0;
         for (i = 1; i<newstr_len-1;i++){  
             if(p[i] > maxlen)
             {
                 maxlen = p[i];
                 centerIndex = i;
             }
         }  
         delete[] p;
        printf("%d:",maxlen);
         for(int i=(centerIndex-1-maxlen)/2;i<=maxlen;i++)
             putchar(str[i]);
         putchar('
    ');
    }
  • 相关阅读:
    【剑指offer】一些简单题05 06
    【剑指offer】11 旋转数组的最小数字
    【剑指offer】10 斐波那契数列
    【剑指offer】 03 数组中重复的数字
    【剑指Offer】 04 二维数组中的查找
    HPCC复习部份
    软工提纲复习
    软件工程复习
    Scala
    [转]对TCP/IP网络协议的深入浅出归纳
  • 原文地址:https://www.cnblogs.com/hlongch/p/5715161.html
Copyright © 2020-2023  润新知