PTA7-31 字符串循环左移(20 分)通俗解法

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:

llo World!He 

读题要抓细节,我们先来梳理下此题的细节有哪些:

1.非负整数N,说明有N=0的情况,如果N=0,输出原字符串

2.循环左移,左移说明从第一个字符开始删除N个字符,循环说明要判定N是否大于字符串长度,如果N小于字符串长度,那么左移N个字符,如果N大于字符串长度,那么容易想到的是取R=N%字符串长度,左移R个字符,如果N等于字符串长度,输出原字符串

3.这是大部分人一开始容易忽略的细节:输入样例包括空格!故C++可以使用getline来接受空格。

好了,分析完细节,此题已经完成一半了,还有一半是算法设计与实现。不过此题要求对C++语言的字符串函数有一定的熟悉度,像作者我做此题就花了46min,大部分时间都在翻阅IDE提供的reference。这里打个小广告,我用的IDE是Cfree5,一款轻量级的C/C++IDE,虽然DEBUG功能不如VS,但是其丰富便捷的C/C++reference确实非常地实用,如果你只需要做这类算法题的话,VS的功能相对来说就太多了,像Cfree5就是不错的选择。哈哈,废话不多说,代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s,t;
	int N,R;
	getline(cin,s);
	cin>>N;
	if(N>0&&N<s.length())
	{
		t.append(s,0,N);/*对临时字符串t追加s中的从下标0开始的N个字符*/
		s.erase(0,N);/*删除s中的从下标0开始的N个字符*/
		s.append(t);/*对s追加临时字符串t*/
	}
	else if(N>s.length())
	{
		R=N%s.length();/*取余*/
		t.append(s,0,R);
		s.erase(0,R);
		s.append(t);
	}
	cout<<s;
	return 0;
}
做题,首先要读题,读题,首先要抓细节,只有把细节抓到位了,再分析得当了,那么解题效率将会大大提高。盲目做题是没有用的,欲速则不达,看完题很多细节都没去分析就做题只会降低效率。总之,抓细节,多分析,方能游刃有余,就算不会,也有可写的余地。

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/80673513
今日推荐