字节跳动的一道笔试题,求赏心悦目的答案
王大锤的自动校对程序😂...,总之就是定义了自动校对的模式如下:
1.三个字母连在一起,去掉一个,比如helllo->hello
2.两对一样的字母(AABB型)去掉第二对的一个字母,比如helloo->hello
3.上面规则优先从左到右匹配,如果是AABBCC,虽然AABB和BBCC都是错误拼写,但是优先考虑修复AABB,结果为AABCC
要求:
输入描述:第一行包括一个数字N,表示待校验字符串个数;
输出描述:N行,每行为修复后的字符串。
我自己写的代码如下(极其丑陋),大佬们不吝赐教哈(我想应该是有什么简单的算法的):
#include <iostream> #include <string> using namespace std; string proofread(const char* s, int n){ string ss; bool flag = false; //先遍历一遍去掉三个连续字母中的一个(规则一的筛选结果不影响规则二) for (int i = 0; i < n - 1; i++) { if (s[i] == s[i + 1]) { if (!flag) { ss.push_back(s[i]); flag = true; //i++; } } else { flag = false; ss.push_back(s[i]); } } ss.push_back(s[n - 1]); //接着进行规则二的筛选 int flag1 = -1; string result; for (int k = 0; k < ss.size() - 1; k++) { if (ss[k] == ss[k + 1]) { if (flag1 == 1) { flag1 = 2; result.push_back(ss[k]); } else { flag1 = 1; result.push_back(ss[k]); } } else { if (flag1 != 2) result.push_back(ss[k]); if (k + 2 < ss.size() && ss[k + 1] != ss[k + 2]) flag1 = -1; } } if (flag1 != 2) result.push_back(ss[ss.size() - 1]); return result; } int main(){ int n; cin >> n; char* s = new char[n]; cin >> s; if (n <= 2) cout << "校正后的字符串为:" << s << endl; else { string ss = proofread(s, n); cout << "校正后的字符串为:" << ss << endl; } return 0; }
#字节跳动##笔试题目##春招#