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 pEnd
void ReverseString(char* pStart, char* pEnd)
{
if(pStart == NULL || pEnd == NULL)
{
while(pStart <= pEnd)
{
char temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart ++;
pEnd --;
}
}
}