反转字符串系列( 以 LevOJ P1073 为例 )

相信大家在肝OJ的过程中,不可避免地会被反转字符串、判断回文数等问题困扰,饺子在这里给大家提供一些思路。

1.判断是否回文。我们首先要用gets()函数读入字符串,然后用strlen()函数求出字符串的长度。分奇偶数找到中间位置,然后向两端遍历字符数组,如果两个方向对应字符不同就把循环break,否则继续进行操作。循环后判断是否遍历完整个数组,如果是就是回文数,否则不是回文数。

2.同时判断是否回文我们还可以用反转字符串的方法。先用gets()读入字符串,用strlen()求出字符串的长度,从最后一个字符向前将反转后的字符串存放到另一个数组当中,然后在后面添加一个 '\0',然后直接用strcmp判断是否与原字符串相等,相等就是回文数,否则不是回文数。

3.反转数字时我们有可能会遇到忽略前导0以及带负号的情况,这时候我们就必须用字符串来处理。忽略前导0的思路就是先找到字符串末尾第一个不是'0'的字符。

接下来我们以( TSOJ 1073 数字反转 )为例进行讲解,代码如下。

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

int main()
{
	char a[1000];
	int head,tail,i;
	while(scanf("%s",a)!=EOF)
	{
		if(strlen(a)==1)
		{
			printf("%c\n",a[0]);
			continue;
		}
		if(a[0]=='-')
		{
			head=1;
			tail=strlen(a)-1;
			while(a[tail]=='0')
				tail--;
			printf("-");
			for(i=tail;i>=head;i--)
				printf("%c",a[i]);
			printf("\n");
		}
		else
		{
			head=0;
			tail=strlen(a)-1;
			while(a[tail]=='0')
				tail--;
			for(i=tail;i>=head;i--)
				printf("%c",a[i]);
			printf("\n");
		}	
	}
	return 0;
}

这题用gets()和scanf()都是可以的,原因是字符串中不会有多余的空格。 

因为只是要输出反转后的数字,我们并不需要存储它或作其他用途,由此我们可以直接一个字符一个字符地输出。( 当然如果要存储它也很简单,只需要把一个字符一个字符输出改成一个字符一个字符地存过去。)

首先,因为要反转的数字有可能带负号,我们就要先判断是否带负号,如果带了负号,就先输出负号然后将后面的数字反转,如果不带,就反转整个字符串。

然后,我们要考虑忽略前导0的问题,这也很简单,我们只需要用一个变量tail从字符串末尾找到第一个不是'0'的字符( 注意:这里是字符'0',是ASCII码的48,与0是完全不同的。),因为要忽略前导0,我们在将0这个数字进行反转的时候就会出一些问题,所以要将0的反转单独拿出来讨论( 我的代码是将长度为1的字符串直接输出,就是因为考虑到这个问题 )。

接下来就是无脑的循环,将剩下的字符依次输出了。( 但是如果要存储的话,别忘了最后添加一个'\0',这样才能以字符串的形式输出 )

最后,别忘了在依次输出完所有字符之后进行换行哦!

此类题目大概就是这个解法,大家可以去TSOJ中找相关例题再练练手。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值