字符串试题整理OK

来源:互联网 发布:sftp端口登录命令 编辑:程序博客网 时间:2024/06/05 07:40

1,实现字符串通配符

int match(char * str, char * ptn) { if (*ptn == '\0') return 1; if (*ptn == '*') { do { if (match(str++, ptn+1)) return 1; } while (*str != '\0'); return 0; } if(*ptn == '?'){return match(str+1, ptn+1); }if(*ptn == *str){return match(str+1, ptn+1); }return 0; }

2,颠倒一个字符串

例如:
god->dog
void reverse(char *str) { reverseFixlen(str, strlen(str)); } void reverseFixlen(char *str, int n) { for(int i = 0; i<(n+1)/2; i++)char temp = str[i]; str[i] = str[n-i-1];str[n-i-1] = temp; } }

3,颠倒一个句子

例如:My name is shell. -> shell is name My.其中每个单词顺序不变

void reverseWordsInSentence(char * sen) { //整个句子颠倒int len = strlen(sen); reverseFixlen(sen, len);char * p = sen;char * q; while (*p!='\0') { //word的第一个字母while (*p==' ' || *p==',' || *p=='.' || *p==';' || *p=='!') p++; //word的最后一个字母q = p; while (*q!=' ' || *q!=',' || *q!='.' || *q!=';' || *q!='!' && q!='\0') q++; //转换reverseFixlen(p, q-p); }} 

4,查找子字符串

BM算法

5,比较两个字符串

int strcmp(char * p1, char * p2) { while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2) { p1++, p2++; } if (*p1 == '\0' && *p2 == '\0') return 0; if (*p1 == '\0') return -1; if (*p2 == '\0') return 1; return (*p1 - *p2); }

6,在一个字符串中找到第一个只出现一次的字符

【google 2006】如输入abaccdeff,则输出b。注意,这里的字符指的是ASCII中的256种。

char firstSingle(char * str) { int a[255]; memset(a, 0, 255*sizeof(int)); //扫一遍进行计数char *p=str; while (*p!='\0') { a[*p++] ++; } //扫一遍统计只出现一次的p = str; while (*p!='\0') { if (a[*p] == 1) return *p; } return '\0'; }

7,字符串转整数

例如输入字符串"345",则输出整数345。  

int atoi(char * str) { int sig = 1;if(*str == '-' ){sig = -1;str++;}else if(*str == '+'){str++;}int num = 0;while(*str!='\0'){if(*str>='0'&&*str<='9'){num = num*10 + (*str++-'0');}}return sig*num;}

8,找最长数字串

题目:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) 
功能: 
在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr 所指内存。 
例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9, outputstr 所指的值为123456789

int continumax(char *outputstr, char *inputstr) { char* pstart = NULL;int max = 0;int len = 0;while(1){if(*inputstr>='0'&&*inputstr<='9')len++;else{if(len>max){max = len;pstart = inputstr-len;}len = 0;}if(*inputstr++=='\0')break;}//拷贝到outputstr中for(int i=0;i<max;i++){*outputstr++=*pstart++;}*outputstr='\0';return max;}

9,左旋转字符串

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。

char* LeftRotateString(char* pStr, unsigned int n){    if(pStr != NULL)    {        int nLength = static_cast<int>(strlen(pStr));        if(nLength > 0 || n == 0 || n > nLength)        {            char* pFirstStart = pStr;            char* pFirstEnd = pStr + n - 1;            char* pSecondStart = pStr + n;            char* pSecondEnd = pStr + nLength - 1;                        // reverse the first part of the string            ReverseString(pFirstStart, pFirstEnd);            // reverse the second part of the strint            ReverseString(pSecondStart, pSecondEnd);            // reverse the whole string            ReverseString(pFirstStart, pSecondEnd);        }    }        return pStr;}// Reverse the string between pStart and pEndvoid ReverseString(char* pStart, char* pEnd){    if(pStart == NULL || pEnd == NULL)    {        while(pStart <= pEnd)        {            char temp = *pStart;            *pStart = *pEnd;            *pEnd = temp;                        pStart ++;            pEnd --;        }    }}



原创粉丝点击