剑指offer-----字符串总结

本文详细介绍了字符串相关的四个经典问题:1.如何替换空格;2.如何在字符流中找到第一个不重复的字符;3.如何判断字符串是否表示数值;4.正则表达式匹配的思路分析。通过具体代码实现,深入解析字符串处理的技巧和注意事项。
摘要由CSDN通过智能技术生成

1.替换空格

思路分析:

首先遍历字符串,遇到‘ ’后进行相应的字符替换‘%’‘2’‘0’

要明确的是在ASCII码表中只有字符0~9,因此20要以‘2’和‘0’来表示

具体实现就是遇到空格后,使用strcpy()函数赋值空格后的字符串;将空格替换为%,2,0,末尾添加'\0';再使用strcat()将之前的字符串接上;以此循环,直至遍历完整个字符串

 

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 1000

int main()
{
	int i;
	char *p=NULL;
	char *ptr=NULL;
	p=(char *)malloc(N*sizeof(char));
	ptr=(char *)malloc(N*sizeof(char));
 
	while(gets(p)!=NULL)
	{
		i=0;
		while(*(p+i))
		{
			if(*(p+i)==' ')
			{
				strcpy(ptr,p+i+1);
				*(p+i)='%';
				*(p+i+1)='2';
				*(p+i+2)='0';
				*(p+i+3)='\0';
				strcat(p,ptr);
				i+=2;
			}
			i++;
		}
		puts(p);
	}
	
	free(p);
	p=NULL;
	free(ptr);
	ptr=NULL;

	return 0;
}

2.字符流中第一个不重复的字符

思路分析:

只实现了输入字符串后从当前字符串判断识别第一个不重复的字符,不能实现动态的字符流中查找!

构建了两个数组,一个input数组用来存放从键盘输入的字符串,另一个ascii数组用来记录input中每个字符出现的次数;

有两点说明:①ascii[input[i]]++ input中每一个出现的字符,按其ASCII码值为下标存放到ascii数组中并记录该字符出现次数;

②遍历ascii中第一个出现次数为一次的字符时,没有将整个ascii数组遍历(因为很多值为0,也就是我们并没有输入该字符),而是借用遍历input数组来实现对ascii数组中出现次数>=1的字符的查找,可以略去很多无意义的遍历和比较(跳过了对为出现字符的查找)

代码实现:

#include <stdio.h>
#include <string.h>

#define M 1000
#define N 256

int main()
{
    char input[M];
    int ascii[N];
    int i=0,len=0,flag=0;

	while(scanf("%s",input)!=EOF)
	{
		flag=0;
		memset(ascii,0,sizeof(ascii));
		len=strlen(input);

		for(i=0;i<len;i++)
			ascii[input[i]]++;

		for(i=0;i<len;i++)
			if(ascii[input[i]]==1)
			{
				printf("%c\n",input[i]);
				flag=1;
				break;
			}

		if(flag==0)
			printf("%c\n",'#');
	}

    return 0;
}

3.表示数值的字符串

思路分析:

一:首先要了解c语言中的整数、浮点数是如何表示的

注意表示数值的字符串遵循的规则:

①在数值之前可能有一个“+”或“-”,

②接下来是0到9的数位表示数值的整数部分;如果数值是一个小数,那么小数点前面或者后面可能会有若干个0到9的数位(不能前面后面同时没有);

表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数

注意:

以下规则牢记:

①关于.
.只能出现一次且必须在e/E之前(如果有e/E的话)
.2       .前面没有数字,c语言语法均允许!不过会有warning
2.e1     .后直接接e/Ec语言语法均允许!不过会有warning
但是不能出现 .e1 这种情况

②关于e/E
e/E只能出现一次且前面必须出现过数字,后面必须紧接整数(可以有正负号)

二.了解了规则之后就可以尝试写代码了

我的直观思路是将输入的字符串从第一位字符开始挨个判断每一个字符是否符合规则,直至不符合退出或者整个字符遍历结束得出结果。这样判断会有大量重复代码且容易出错。

看到别人分享了一段代码,每次只判断一个字符并设置标志位,循环判断直至得出结果,代码巧妙且容易实现,但其代码也有一些小的bug。比如会把“+、-”,“.”,".e1"这种误判为数值(对.和e的前后紧接字符都要做判断)。不过整体思路很巧妙。

.

 

代码实现:

#include <stdio.h>

#define N 1000

bool isNumerical(const char *s)
{
	int num=0,dot=0,nume=0;//分别是整数、小数点、指数是否存在的标志位
	
	if(s==NULL||*s=='\0')
		return false;

	if(*s=='+'||*s=='-')
	{
		s++;
		if(*s=='\0')
			return false;
	}
	while(*s!='\0')
	{
		if(*s>='0'&&*s<='9')
		{
			s++;
			num++;
		}
		else if(*s=='.')
		{
			if(dot>0||nume>0)
				return false;
			s++;
			dot++;
			if((num==0&&*s=='\0')||(num==0&&*s=='e')||(num==0&&*s=='E'))
				return false;
		}
		else if(*s=='e'||*s=='E')
		{
			if(nume>0||num==0)
				return false;
			s++;
			nume++;
			if(*s=='+'||*s=='-')
				s++;
			if(*s=='\0')
				return false;
		}
		else
			return false;
	}

	return true;
}

int main()
{
	char input[N];
	while(scanf("%s",input)!=EOF)
	{
		if(isNumerical(input)==true)
			printf("Yes\n");
		else
			printf("No\n");
	}
   
    return 0;
}

4.正则表达式匹配

思路分析:

一:正则表达式简介

正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。如以下一些规则

二:代码思路:

 

代码实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值