今早字节跳动的第二题没有通过全部case原因

我只通过了百分之40多,代码缺陷我没查出来,我最后猛然想到了是不是case有中文,一测试,中文输入乱码,等我解决后已经关闭考试了。。。请问通过的大佬们能否告知以下呢,万分感谢!
第二题是字符串去重,三个相同字母删一个,AABB删一个B,从左往右运算

以下是我编写的代码:

import java.util.Scanner;
public class Main {     public static void main(String[] args) throws Exception {         Scanner sc = new Scanner(System.in,"gbk");         int n = sc.nextInt();//获取N         StringBuilder[] val = new StringBuilder[n];//创建n个StringBuilder,不用string是因为StringBuilder方便删除         for (int i = 0; i < n; i++) {             val[i] = new StringBuilder(sc.next());//循环获取n个字符串         }
for (int i = 0; i < n; i++) {//遍历每个字符串             StringBuilder s = val[i];//当前字符串             int length = s.length();//当前字符串长度,删除之后会变化             for (int j = 2; j < length; j++) {//直接从第三个字符开始                 if ((s.charAt(j-2) == s.charAt(j-1)) && (s.charAt(j-1) == s.charAt(j))) {//如果前面二个包括本身都相等                     s.deleteCharAt(j);//删除j位置的字符                     j = 2;//重置j=2,再来一次                     length = s.length();//修改停止长度                     continue;//进入下一次循环                 }                 if (j >= 3 && (s.charAt(j-3) == s.charAt(j-2)) && (s.charAt(j-1) == s.charAt(j))) {//如果是AABB,下面代码同上                     s.deleteCharAt(j-1);                     j = 2;                     length = s.length();                     continue;                 }             }         }         for (StringBuilder s : val) {//输出所有已修改的字符串             System.out.println(s);         }     } }
我好像发现了。。。。当匹配到三个或者AABB时,删除完了我把j重置为2,“j = 2;//重置j=2,再来一次”,这行代码,虽然紧接着continue了,但是j++。。。。然后j变成了3,如果恰巧这时的0,1,2三个字符是三个相同的相等的字符,它们被跳过了!所以case只通过了百分之四十四,难受。。。。
#春招##笔试题目#
全部评论
没中文应该,我也没处理中文过了
点赞 回复 分享
发布于 2019-03-16 12:16
我菜鸡😂只会做前两个,这就是其中一个。 void solve(vector<char> s){     for(int i = 0 ; i < s.size()-2 ; ){         if(s[i] == s[i+1] && s[i+1] == s[i+2]){             s.erase(s.begin() + i);             continue;         }         if(i+3 < s.size()){             if(s[i] == s[i+1] && s[i+2] == s[i+3] && s[i+1] != s[i+2]){                 s.erase(s.begin() + i+2);                 continue;             }         }         i++;     }     for(int i = 0 ; i < s.size() ; i ++){         printf("%c", s[i]);     }     printf("\n"); }
点赞 回复 分享
发布于 2019-03-16 12:21
//用javascript,核心就以下两行代码 str = str.replace(/(\w)\1[2,]/g,'$1$1'); str = str.replace(/(\w)\1(\w)\2/g,'$1$1$2');
点赞 回复 分享
发布于 2019-03-16 12:45
第二题字符串去重吗
点赞 回复 分享
发布于 2019-03-16 12:17
没有中文的,我只考虑英文字母就过了
点赞 回复 分享
发布于 2019-03-16 12:19
是不是只扫了一遍,用DFS应该很好做吧
点赞 回复 分享
发布于 2019-03-16 12:21
递归了一下
点赞 回复 分享
发布于 2019-03-16 12:25
我也用的StringBuffer,但是没有在原有基础上改。另外新建的一个
点赞 回复 分享
发布于 2019-03-16 12:29
通过所有测试是不是就是100%了
点赞 回复 分享
发布于 2019-03-16 12:31
var number = readline() while(number--){ var line = readline().split(''), i = 0 while (i < line.length-1) { if(line[i] == line[i+1]){ while(line[i+2]==line[i]){ line.splice(i+2,1) } while(line[i+2]==line[i+3]){ line.splice(i+2,1) } } i++ } console.log(line.join('')) } 始终说我超时,感觉送分题,就是过不了,难受
点赞 回复 分享
发布于 2019-03-16 12:31
求第三题的思路
点赞 回复 分享
发布于 2019-03-16 12:31
public static void getTrueString() { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); for (int i = 0; i < n; i++) { char[] str = sc.nextLine().toCharArray(); LinkedList<Character> list = new LinkedList<>(); for (char ch : str) { int index = list.size(); if ((index - 2) >= 0 && list.get(index - 1) == ch && list.get(index - 2) == ch) { //三个相同 continue; } if ((index - 3) >= 0 && list.get(index - 3) == list.get(index - 2) && list.get(index - 1) == ch) { continue; } list.add(ch); } for (int j = 0; j < list.size(); j++) { System.out.print(list.get(j)); } System.out.println(); } }
点赞 回复 分享
发布于 2019-03-16 12:37
两种情况分开处理,可以通过全部case,不能递归,用递归开销太大,用递归就输了 #include<iostream> #include<string> #include<vector> using namespace std; int main() {     int n = 0;     cin >> n;     string strIn;     string strTmp;     string strOut;     vector<string> vStr, vRes;     while (n--)     {         cin >> strIn;         vStr.push_back(strIn);     }     for (int i = 0; i < vStr.size(); i++)     {         strTmp = vStr[i];         int k = 0;         while (k < strTmp.length())         {             ////////////////////////////////             string str3;             str3 += strTmp[k];             str3 += strTmp[k];             str3 += strTmp[k];             int nIdx = strTmp.find(str3);             if (-1 == nIdx)             {                 k += 1;                 continue;             }             else             {                 strOut += strTmp.substr(0, nIdx);                 strOut += strTmp[k];                 strOut += strTmp[k];                 strOut += strTmp.substr(nIdx + 3, strTmp.length());                 strTmp = strOut;                 strOut.clear();             }             //////////////////////////         }         int h = 0;         strOut.clear();         while (h < strTmp.length())         {             if (h + 3 < strTmp.length())             {                 string str2;                 if ((strTmp[h] == strTmp[h + 1]) && (strTmp[h + 2] == strTmp[h + 3]))                 {                     str2 += strTmp[h];                     str2 += strTmp[h + 1];                     str2 += strTmp[h + 2];                     str2 += strTmp[h + 3];                     int nIdx = strTmp.find(str2);                     strOut += strTmp.substr(0, nIdx);                     strOut += strTmp[h];                     strOut += strTmp[h + 1];                     strOut += strTmp[h + 2];                     strOut += strTmp.substr(nIdx + 4, strTmp.length());                     strTmp = strOut;                     strOut.clear();                 }             }             h += 1;         }         vRes.push_back(strTmp);     }     for (int i = 0; i < vRes.size(); i++)     {         cout << vRes[i] << endl;     }     system("pause");     return 0; }
点赞 回复 分享
发布于 2019-03-16 12:52
package com.leyou.test; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class Main { private static List<String> res=new LinkedList<>(); public static void main(String[] args) { Scanner scanner=new Scanner(System.in); //接收字符串数目 int n=scanner.nextInt(); List<String> strings=new LinkedList<>(); for(int i=0;i<n;i++){ strings.add(scanner.next()); } scanner.close(); solve(strings); for(int i=0;i<res.size();i++){ System.out.println(res.get(i)); } } public static void solve(List<String> strings){ for(int i=0;i<strings.size();i++){ String string=removeThree(strings.get(i)); String string1=removeAABB(string); res.add(string1); } } public static String removeThree(String string){ String newString=""; if(string.length()<3){ return string; } for(int i=1;i<string.length();i++){ if((i+1)<=string.length()-1){ char pre=string.charAt(i-1); char cur=string.charAt(i); char next=string.charAt(i+1); if(cur==pre&&cur==next){ newString=string.substring(0,i)+string.substring(i+1); break; } }else{ return string; } } newString=removeThree(newString); return newString; } private static String removeAABB(String string){ if(string.length()<4){ return string; } char cur = 0,next1,next2,next3; String newString=""; for(int i=0;i<string.length();i++){ if((string.length()-i)>=4){ cur=string.charAt(i); next1=string.charAt(i+1); next2=string.charAt(i+2); next3=string.charAt(i+3); if(cur==next1&&cur!=next2&&next2==next3){ newString=string.substring(0,i+2)+string.substring(i+3); break; } }else {return string;} } newString=removeAABB(newString); return newString; } }
点赞 回复 分享
发布于 2019-03-16 19:40
想到两种最简单的方法: 一种是多遍扫,扫到满足条件的字符串为止,复杂度>O(n); 第二种扫一遍,做好充分的标记位,一位一位根据标记位来判断需不需要输出,及时更新标记位,复杂度O(n);代码如下: 测了一下(不知道对不对😂): aabbccddeeff -> aabccdeef aabccdddfff -> aabccddf abbbbbbbbbbbba -> abba aaabbcccee -> aabcce #include <iostream> #include <string> using namespace std; int main() {     int countOfString = 0;     cin >> countOfString;          while (countOfString--) {         string inputStr, outputStr = "";         cin >> inputStr;         if (inputStr.length() == 0) {             cout << "No String!" << endl;             return 0;         }                  // firstRepeat是前面有重复的,secondRepeat是当前离自己最近的有无重复         int firstRepeat = 1, secondRepeat = 0;         // 输出串中默认放入第一个         outputStr.push_back(inputStr[0]);         // 从输入串中的第一个开始扫,扫一遍即可         for (int i = 1; i < inputStr.length(); i++) {             if (inputStr[i] != inputStr[i-1]) {                 // 当前字符与前一个不同情况:                 if (firstRepeat == 2) {                     // 如果前面的字符已经重复了两次 如:aa                     if (secondRepeat == 0) {                         // 如果当前的字符还没出现过,当前字符数+1,如aab                         secondRepeat ++;                     }else {                         // 否则,当前的字符作为‘前一个’,如aabc,初始化first和second                         firstRepeat = 1;                         secondRepeat = 0;                     }                 }             }else {                 // 与前一字符相同的情况:                 if (secondRepeat != 0) {                     // 1. aabb                     secondRepeat ++;                 }else {                     // 2. aaa                     firstRepeat ++;                 }             }             // 开始根据first和second给输出赋值             if (firstRepeat == 3) {                 // aaa情况                 firstRepeat --;             }else if (secondRepeat == 2) {                 // aabb情况                 firstRepeat = --secondRepeat;                 secondRepeat = 0;             }else {                 // 满足上述两种情况不输出,否则直接输出                 outputStr.push_back(inputStr[i]);             }         }         // 输出         for (int i = 0; i < outputStr.length(); i++) {             cout << outputStr[i];         }         cout << endl;     }     return 0; }
点赞 回复 分享
发布于 2019-03-16 12:58
#include <iostream>#include <string>#include <vector>using namespace std;void solve(std::string& s){ if (s.size() <= 2) return; std::string ret; ret = s[0]; int count = 1; int flag = 0;//0代表第一个无重复,1代表AA,2代表AAB,3代表AAA,4代表AABB; for (int i = 1; i < s.size(); i) { if (s[i] != s[i - 1]) { flag = (flag == 1) ? 2 : 0; } else { switch (flag) { case 0:flag = 1; break; case 1:flag = 3; break; case 2:flag = 4; break; } } switch(flag) { case 0:ret = s[i]; break; case 1:ret = s[i]; break; case 2:ret = s[i]; break; case 3:flag = 1; break; case 4:flag = 2; break; default:break; } } s = ret;}int main(){ int n; cin >> n; vector<string> temp(n); for (int i = 0; i < n; i) { cin >> temp[i]; solve(temp[i]); } for (auto s : temp) { std::cout << s << std::endl; } return 0;}基于有限状态机
点赞 回复 分享
发布于 2019-03-16 13:02
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int line=scanner.nextInt(); for (int i=0;i<line;i++) { fix(scanner.next()); } } public static void fix(String line){ char lastChar='\n'; boolean doubleChar=false; boolean linkChar=false; for (char c:line.toCharArray()){ if (c==lastChar){ if (doubleChar){ continue; }else { if (linkChar){ continue; }else { doubleChar=true; } } }else { linkChar=doubleChar; doubleChar=false; } lastChar=c; System.out.print(c); } System.out.println(); } } 我的,扫一遍,记录两个状态就行了
点赞 回复 分享
发布于 2019-03-16 13:09
一个vector 保存输出了的数. 判断最后两个或 三个就可以了.  第三题: 找到最小数 正一遍 反一遍 (注意越界问题)
点赞 回复 分享
发布于 2019-03-16 13:18
和中文没什么关系
点赞 回复 分享
发布于 2019-03-16 13:47
开一个栈不就好了……
点赞 回复 分享
发布于 2019-03-16 14:54

相关推荐

不愿透露姓名的神秘牛友
11-05 12:57
已编辑
思朗 处理器 N+8 公积金12 硕士985
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务