1. 程式人生 > >PTA7-31 字串迴圈左移(20 分)通俗解法

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;
}
做題,首先要讀題,讀題,首先要抓細節,只有把細節抓到位了,再分析得當了,那麼解題效率將會大大提高。盲目做題是沒有用的,欲速則不達,看完題很多細節都沒去分析就做題只會降低效率。總之,抓細節,多分析,方能遊刃有餘,就算不會,也有可寫的餘地。