日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字节跳动---万万没想到之聪明的编辑

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节跳动---万万没想到之聪明的编辑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字節跳動—萬萬沒想到之聰明的編輯

文章目錄

    • 字節跳動---萬萬沒想到之聰明的編輯
    • 一、題目描述
    • 二、分析
    • 三、代碼

一、題目描述

我叫王大錘,是一家出版社的編輯。我負責校對投稿來的英文稿件,這份工作非常煩人,因為每天都要去修正無數的拼寫錯誤。但是,優秀的人總能在平凡的工作中發現真理。我發現一個發現拼寫錯誤的捷徑:

  • 三個同樣的字母連在一起,一定是拼寫錯誤,去掉一個的就好啦:比如 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; }

總結

以上是生活随笔為你收集整理的字节跳动---万万没想到之聪明的编辑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。