【機試備考】Day13-尋找變化前01序列 | 字串刪除指定元素
阿新 • • 發佈:2021-02-01
題目
BUPT 2016 計算機 ProblemB
給你一個01序列,HDLC協議處理的話,如果出現連續的5個1會補1個0。例如1111110,會變成11111010。
現在給你一個經過HDLC處理後的01序列,你需要找到HDLC處理之前的01序列。
例如給你11111010
你需要輸出1111110
輸入描述
輸入正整數N,表示N例測試。接著輸入N組資料,每組輸入經過HDLC處理過的01序列(長度小於100)。
輸出描述
對每組輸入資料,輸出HDLC處理前的01序列。
示例
輸入
2
11111010
1111100
輸出
1111110
111110
題解
法1:string庫函式
最近做string的題有點魔怔了,看見string就想用庫,但是其實這道題用庫並不方便,用庫的程式碼如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
string aft;
for(int i=0;i<n;i++){
cin>>aft;
int start=0;//記錄擷取的子串在整個aft中的起始位置
string temp=aft;//把刪掉0前面子串刪除之後剩餘的串
int pos=aft.find("11111");
while(pos!=string::npos)
{
aft.erase(start+pos+5,1);
temp.erase(pos+5,1);
start+=pos+5;//更新temp在aft中的起始位置
temp=temp.substr(pos+5);//刪掉遍歷過的部分,形成新的子串
pos=temp.find("11111");//在新子串中找五個1的位置
}
cout<<aft<<endl;
}
}
有點混亂,權當熟悉庫函數了吧
法2:遍歷刪‘0’
好想又好寫,個人感覺就是最佳做法了
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
string aft;
for(int i=0;i<n;i++){
cin>>aft;
int count=0;
for(int j=0;j<aft.length();j++)
{
if(aft[j]=='1')
count++;
else
count=0;
//連續5個1,刪除後面一個‘0’,count歸零
if(count==5)
{
aft.erase(j+1,1);
count=0;
}
}
cout<<aft<<endl;
}
}