字符串试题整理OK

本文详细介绍了C++编程中的字符串通配符匹配、字符串反转、句子颠倒、子字符串查找、比较字符串、查找唯一字符、字符串转整数、连续最长数字串查找、左旋转字符串等核心算法实现及应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 --;
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值