zoukankan      html  css  js  c++  java
  • 面试编程题(字符串)

    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('
    ');
    }
  • 相关阅读:
    PAT 解题报告 1009. Product of Polynomials (25)
    PAT 解题报告 1007. Maximum Subsequence Sum (25)
    PAT 解题报告 1003. Emergency (25)
    PAT 解题报告 1004. Counting Leaves (30)
    【转】DataSource高级应用
    tomcat下jndi配置
    java中DriverManager跟DataSource获取getConnection有什么不同?
    理解JDBC和JNDI
    JDBC
    Dive into python 实例学python (2) —— 自省,apihelper
  • 原文地址:https://www.cnblogs.com/hlongch/p/5715161.html
Copyright © 2011-2022 走看看