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

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

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 6 评论
分享
牛客网
牛客企业服务