字节跳动的一道笔试题,求赏心悦目的答案

王大锤的自动校对程序😂...,总之就是定义了自动校对的模式如下:
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;
}

#字节跳动##笔试题目##春招#
全部评论
char s[]="helllooooolloo"; int k=0; for (int i=0;s[i]!='\0';i++) { s[k++]=s[i]; if((k>=3)&&(s[k-1]==s[k-2])&&(s[k-2]==s[k-3])) k--; if((k>=4)&&(s[k-1]==s[k-2])&&(s[k-3]==s[k-4])) k--; } s[k]='\0'; //helloloo cout<<s<<endl;
点赞 回复
分享
发布于 2019-08-14 17:23
字节齐刷刷四道编程题😊
点赞 回复
分享
发布于 2019-03-18 19:16
联想
校招火热招聘中
官网直投
递归,每次从左处理第一个满足条件的,结果作为参数传入下一个回合,直到判定该轮次找不到异常。写起来还是挺优雅的,可以ac
点赞 回复
分享
发布于 2019-03-18 20:46
let n = parseInt(readline()); let ans = [] let reg1 = /([0-9a-zA-Z])\1{2}/g; let reg2 = /(.)\1(.)\2/g; for (let i = 0; i < n; i++) { let str = readline() let before = str.length let after = -1 while (before != after) { before = str.length if (str.match(reg1) != null) { str.match(reg1).forEach(element => { str = str.replace(element, element.slice(0, element.length - 1)) }); } after = str.length } before = str.length after = -1 while (before != after) { before = str.length if (str.match(reg2) != null) { str.match(reg2).forEach(element => { str = str.replace(element, element.slice(0, element.length - 1)) }); } after = str.length } ans.push(str) } for(let j = 0;j<ans.length;j++){ console.log(ans[j]) }
点赞 回复
分享
发布于 2019-03-20 13:57
#include<stdio.h> #define S 1000000 int check(char str[]){ int i = 0; int j; int count1 = 0; //规则1,三个同样的字母连续 int count2 = 0; //规则2,两对一样的字母连在一起 int aa = 0; while(str[i]!='\0'){ if(i==0){ count1 = 1; count2 = 0; aa = 0; }else{ if(str[i]==str[i-1]){ count1++; if(count1==2){ aa = 0; count2++; } }else{ count1 = 1; aa++; if(aa==2){ count2 = 0; } } } if(count1==3){ // 出现连续三个相同字符 j = i; while(str[j+1]!='\0'){ str[j] = str[j+1]; j++; } str[j] = '\0'; i = i-2; count1 = 1; count2 = 0; aa = 0; continue; } if(count2==2){ j = i; while(str[j+1]!='\0'){ str[j] = str[j+1]; j++; } str[j] = '\0'; i = i-3; count1 = 1; count2 = 0; aa = 0; continue; } i++; } return 0; } main(){ int i,n; char str[S]; scanf("%d", &n); for(i=0; i<n; i++){ scanf("%s", &str); check(str); printf("%s\n", str); } } 想问下这里的aa变量的作用?
点赞 回复
分享
发布于 2019-04-13 16:29
凑个热闹,犹记得当初只A了两题 public static String checkString(String str)     {         if(str==null||str.length()==0)         {             return str;         }         char[] strArray=str.toCharArray();         boolean[] flag=new boolean[strArray.length];         int curIndex=0;//当前嗅探位置         while(curIndex<strArray.length)         {             //最后一个字符或者和后一个字符不相同             if((curIndex==strArray.length-1)||strArray[curIndex]!=strArray[curIndex+1])             {                 curIndex++;             }             else             {                //连续三个字符                 int postIndex=curIndex+2;                 while(postIndex<strArray.length&&strArray[postIndex]==strArray[curIndex])                 {                     flag[postIndex]=true;                     postIndex++;                 }                 //保证不越界                 if(postIndex>=strArray.length-1)                 {                     curIndex=strArray.length;                 }                 else                  {                     while(strArray[postIndex]==strArray[postIndex+1])                     {                         flag[postIndex+1]=true;                         postIndex++;                     }                 }                 curIndex=postIndex;             }          }         for(int i=0;i<strArray.length;i++)         {             if(flag[i])             {                 strArray[i]='#';             }         }         return String.valueOf(strArray).replaceAll("#","");     }
点赞 回复
分享
发布于 2019-04-13 16:36
/*     1.三个同样的字母连在一起,一定是拼写错误,去掉一个就好了。比如:helllo↣hello     2.两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的第一个字母。比如:helloo↣hello     3.上面的规则优先“从左到右”匹配,即如果是AABBCC型,应优先考虑修复AABB为AABCC     */ let str1 = "hlllaaaeee"; let str2 = "aabb"; let str3 = "aabbcc"; let getStr1 = function(str){ let newArr = str.split(''); for(let i=0;i<newArr.length;i++){ for(let j=i;j<newArr.length;j++){ if(newArr[i] === newArr[j+2]){ newArr.splice(i,1); continue; } } } return newArr; } let getStr2 = function(str){ let count = 0; let newArr = str.split(''); for(let i=0;i<newArr.length;i++){ for(let j=i;j<newArr.length;j++){ if(newArr[i] === newArr[j+1]){ count++; if(count = 2){ newArr.splice(j+2,1); }else if(count > 3){ newArr.splice(j+2,1); } continue; } } } return newArr; } let getNewString = function(){ console.log(getStr1(str1).join('')); console.log(getStr2(str2).join('')); console.log(getStr2(str3).join('')); } getNewString();
点赞 回复
分享
发布于 2019-09-06 00:39
字数限制,没法直接贴题解,贴个链接:https://github.com/southday/codejava/blob/master/src/main/java/southday/java/acm/nowcoder/bytedance/spring2019/StringProofreader.java
点赞 回复
分享
发布于 2020-02-19 15:36
根据输入的字符串生成对应的int数组,用来标记该字符是否连续重复,不重复为1,重复(是重复的第几个,即ints[i]=ints[i-1]+1)。用该数组标记什么时候应该处理,当出现3或 1 2 1 2 这样的删除最后一个字符,然后重新得到出里后得到int数组,继续处理
点赞 回复
分享
发布于 2020-08-16 14:28

相关推荐

点赞 6 评论
分享
牛客网
牛客企业服务