1. 程式人生 > 其它 >【機試備考】Day13-尋找變化前01序列 | 字串刪除指定元素

【機試備考】Day13-尋找變化前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;
	}
}