PTA7-31 字串迴圈左移(20 分)通俗解法
阿新 • • 發佈:2019-01-23
輸入一個字串和一個非負整數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; }