字节跳动---万万没想到之聪明的编辑
字節跳動—萬萬沒想到之聰明的編輯
文章目錄
- 字節跳動---萬萬沒想到之聰明的編輯
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
我叫王大錘,是一家出版社的編輯。我負責校對投稿來的英文稿件,這份工作非常煩人,因為每天都要去修正無數的拼寫錯誤。但是,優秀的人總能在平凡的工作中發現真理。我發現一個發現拼寫錯誤的捷徑:
- 三個同樣的字母連在一起,一定是拼寫錯誤,去掉一個的就好啦:比如 helllo -> hello
- 兩對一樣的字母(AABB型)連在一起,一定是拼寫錯誤,去掉第二對的一個字母就好啦:比如 helloo -> hello
- 上面的規則優先“從左到右”匹配,即如果是AABBCC,雖然AABB和BBCC都是錯誤拼寫,應該優先考慮修復AABB,結果為AABCC
我特喵是個天才!我在藍翔學過挖掘機和程序設計,按照這個原理寫了一個自動校對器,工作效率從此起飛。用不了多久,我就會出任CEO,當上董事長,迎娶白富美,走上人生巔峰,想想都有點小激動呢!
……
萬萬沒想到,我被開除了,臨走時老板對我說: “做人做事要兢兢業業、勤勤懇懇、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我現在整個人紅紅火火恍恍惚惚的……
請聽題:請實現大錘的自動校對程序
輸入描述:
第一行包括一個數字N,表示本次用例包括多少個待校驗的字符串。后面跟隨N行,每行為一個待校驗的字符串。輸出描述:
N行,每行包括一個被修復后的字符串。輸入例子1:
2 helloo wooooooow二、分析
方法一:自動機
可以通過動態規劃之KMP字符匹配算法來了解自動機的原理
對于本題也可以使用自動機的思想(以AB字符模擬):
-
1.當第一次進入狀態機的字母是A時,就處于0狀態,繼續判斷下一個字符
-
2.當第二次輸入的字符不是A時,目前構成AX這種情況,不屬于題意中的任意一個情況,狀態不變,繼續判斷
-
3.當第二次輸入的字符還是A時,目前就構成AA這種情況,可能出現AAA,所以就進入1狀態。
-
4.當處于1狀態時,第三次輸入的字符如果不是A,目前構成AAB,可能會出現AABB型,所以需要判斷,進入2狀態
-
5.當處于1狀態時,第三次輸入的字符如果是A,目前構成AAA,滿足提議當中不能出現來連續3個同樣的字符的情況,就需要刪除一個,所以我們就忽略這個字符(就當沒看見)
-
6.如果當前處于2狀態,第4次輸入的字符如果還是B,那么就構成AABB型,屬于題意中的情況,需要刪除一個B,所以我們仍然忽略這個字符(就當沒看見)
-
7.如果當前處于2狀態,第4次輸入的字符如果不是B,那么就構成AABX型,不屬于題意中的任意一個情況,狀態變為0,繼續判斷
總結:0狀態是用來處理不是AAA型或者AABB型的情況;1狀態是用來解決AAA型的情況(忽略不加入結果集);2狀態是用來解決AABB型的情況(忽略不加入結果集)
方法二:暴力求解
直接一趟遍歷,把AAA的情況刪除一個A,AABB的情況刪除一個B,注意邊界問題
三、代碼
方法一:自動機模擬前后4個字符的情況
#include<iostream> #include<string> using namespace std;int main() {int n;cin >> n;while (n--) {int state = 0;//代表狀態機🐔的3種狀態,初始化為狀態0,處理任意型字符char cur;//代表當前待判斷的字符,string str;//目標字符串cin >> str;char last = str[0];//初始化為第一個字符string ans = "";//保存結果集ans += str[0];//初始化for (int i = 1; i < str.size(); ++i) {//開始判斷cur = str[i];switch (state){case 0:{if (cur == last)//如果當前字符和上一個字符是相等的,進入狀態//1,因為可能出現AAA的情況,否則是肯定出會出現,繼續在狀態0;state = 1; //進入狀態1:AA形式else state = 0; //繼續狀態0:AB形式,即正常形式break;}case 1:{if (cur == last)continue;//AAA,忽略即可,不加入結果集elsestate = 2;//進入狀態3:AAB形式,因為可能出現AABB的情況break;}case 2:{if (cur == last)continue;//AABB,忽略即可,不加入結果集elsestate = 0;//AABC,就是狀態0,因為不可能出現AAA或AABB的情況break;}default:break;}//加入結果集ans = ans + cur;//更新上一個元素last = cur;}cout << ans << endl;}return 0; }方法二:暴力求解
#include <bits/stdc++.h> using namespace std;int main() {int n;cin >> n;string s;while (n--){cin >> s;//規則1:AAA的情況for(int i = 2; i < s.length(); i++) {//三個連續相等的字符if(s[i] == s[i-1] && s[i-1] == s[i-2]) {//刪除s.erase(i, 1);i--;if(s.length() < 3)break;}}//規則2:AABB的情況for(int i = 3; i < s.length(); i++) {if(s[i] == s[i-1] && s[i-2] == s[i-3]) {//刪除s.erase(i, 1);i--;if(s.length() < 4)break;}}cout << s << endl;}return 0; }總結
以上是生活随笔為你收集整理的字节跳动---万万没想到之聪明的编辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯---生成格雷码
- 下一篇: 字节跳动---万万没想到之抓捕孔连顺