首页 > 试题广场 >

万万没想到之聪明的编辑

[编程题]万万没想到之聪明的编辑
  • 热度指数:54993 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发现拼写错误的捷径:

1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

我特喵是个天才!我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!
……
万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我现在整个人红红火火恍恍惚惚的……

请听题:请实现大锤的自动校对程序

数据范围: ,每个用例的字符串长度满足

输入描述:
第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。

后面跟随N行,每行为一个待校验的字符串。


输出描述:
N行,每行包括一个被修复后的字符串。
示例1

输入

2
helloo
wooooooow

输出

hello
woow
示例2

输入

1
nowcoder

输出

nowcoder
importjava.util.Scanner;
 
// 注意类名必须为 Main, 不要有任何 package xxx 信息
publicclassMain {
    publicstaticvoidmain(String[] args) {
        Scanner in = newScanner(System.in);
        intnum = in.nextInt(); // 字符串总数
        // 注意 hasNext 和 hasNextLine 的区别
        while(in.hasNext()) { // 注意 while 处理多个 case
            String s = in.next();//每个字符串
            //去除三重复字母
            String s1 = fixThree(s);
            //去除两对重复
            String s2 = fixDouble(s1);
            System.out.println(s2);
        }
    }
 
    privatestaticString fixThree(String s) {
        char[] chars = s.toCharArray();
        StringBuilder res = newStringBuilder();
        for(inti = 0; i < chars.length; i++) {
            if(i > 1) {
                if(chars[i] == chars[i-1] && chars[i-1] == chars[i-2]) {
                    continue;
                }
            }
            res.append(chars[i]);
        }
        returnres.toString();
    }
 
    privatestaticString fixDouble(String s) {
        char[] chars = s.toCharArray();
        StringBuilder res = newStringBuilder();
        for(inti = 0; i < chars.length; i++) {
            if(i > 2) {
                if(chars[i] == chars[i-1] && chars[i-2] == chars[i-3]) {
                    chars[i] = '-';
                    continue;
                }
            }
            res.append(chars[i]);
        }
        returnres.toString();
    }
}

一开始不加上chars[i] = '-';会报错,debug后想到的这个解决办法

发表于 2024-03-07 11:22:58 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        for(int i=0;i<num;i++){

//            System.out.println("变成"+str);
            System.out.println(getStr(sc.next(),0));
        }

    }

    public static String getStr(String str,int i){
        char[] list=str.toCharArray();
        for(;i<str.length();i++){
            if(i+3<=str.length()&&list[i]==list[i+1]&&list[i]==list[i+2]){
                    str=str.substring(0,i+2)+(list.length>=i+3?str.substring(i+3):"");
                    break;
                }
          
           else if(i+4<=str.length()&&list.length>=i+4&&list[i]==list[i+1]&&list[i+2]==list[i+3]){
                    str=str.substring(0,i+3)+(list.length>=i+4?str.substring(i+4):"");
                    break;
                }
            }
        
        if(i==str.length()) {
            return str;
        }else {
            return getStr(str,Math.max(0,i-4));
        }

    }

}
编辑于 2022-04-10 00:10:14 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < count; i++) {
            System.out.println(scanner.nextLine().replaceAll("(.)\\1+","$1$1").replaceAll("(.)\\1(.)\\2","$1$1$2"));
        }
    }
}
发表于 2022-02-10 10:07:06 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String args[]){
        Main englishRevise = new Main();
        Scanner s = new Scanner(System.in);
        char[] chars;
        String[] strings = new String[s.nextInt()];
        for (int i = 0; i < strings.length; i++) {

        }
        for (int i = 0; i < strings.length; i++) {
            strings[i] = s.next();
            chars = strings[i].toCharArray();
            
            for (int j = 0; j < chars.length-2; j++) {
                if(chars[j]==chars[j+1]&&chars[j+1]==chars[j+2]){
                    String delete = englishRevise.delete(strings[i], j+2);
                    strings[i]=delete;
                    chars = delete.toCharArray();
                    j=0;
                    
                }
            }

            
            for (int j = 0; j < chars.length - 3; j++) {
                if(chars[j]==chars[j+1]&&chars[j+1]!=chars[j+2]&&
                        chars[j+2]==chars[j+3]){
                    String delete = englishRevise.delete(strings[i], j+2);
                    strings[i] = delete;
                    chars = delete.toCharArray();
                    j=0;
                    
                }
            }
            
            for (int j = 0; j < chars.length - 4; j++) {
                if(chars[j]==chars[j+1]&&chars[j+1]!=chars[j+2]&&
                        chars[j+2]==chars[j+3] && chars[j+3]!=chars[j+4]&&
                        chars[j+4]==chars[j+5]){
                    String delete = englishRevise.delete(strings[i], j+2);
                    strings[i]=delete;
                    chars = delete.toCharArray();
                    j=0;
                    
                }
            }
        }
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
    }

    public String delete(String str,int index){
        String str1 = str.substring(0, index);
        String str2 = str.substring(index+1);
        String string = str1+str2;
        return string;
    }
}


发表于 2021-12-23 21:03:18 回复(1)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        for(int i=0;i<N;i++){
            String str = scan.next();
            System.out.println(removeDuplicate(str));
        }
        
    }
    
    public static String removeDuplicate(String s){
        //位置i处的字母,左边到这个字母最长连续重复的长度:
        //比如 aab: map.get(0) = 1, map.get(1) = 2, map.get(2) = 1
        Map<Integer, Integer> map = new HashMap<>();
        StringBuilder str = new StringBuilder(s);
        map.put(0, 1);
        int i = 1;
       
        while(i<str.length()){
            
            if(str.charAt(i)==str.charAt(i-1)){
                if(map.containsKey(i-1)&&map.get(i-1)>=2){
                    str.deleteCharAt(i);
                    continue;
                } 
                if(i>=2&&str.charAt(i-2)!=str.charAt(i)&&
                   map.containsKey(i-2)&&map.get(i-2)==2){
                    str.deleteCharAt(i);
                    continue;
                }
                
                map.put(i, map.getOrDefault(i-1,0)+1);
                i++;
            }
            else{
                map.put(i, 1);
                i++;
            }
            
        }
        
        
        return str.toString();
        
        
    }
}


发表于 2021-09-18 15:31:45 回复(0)
暴力扫描一次,先解决AAA问题,再判断是否需要解决AABB问题
import java.util.*;

public class Main {
    
    public static void main (String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        sc.nextLine();
        String[] str = new String[num];
        for (int i = 0; i < num; i++) {
            str[i] = sc.nextLine();
        }
        
        for (int i = 0; i < num; i++) {
            StringBuilder sb = new StringBuilder(str[i]);
            for (int j = 0; j < sb.length(); j++) {
                // 1、2位相等
                if ((j + 1) < sb.length() && sb.charAt(j) == sb.charAt(j + 1)) {
                    if ((j + 2) < sb.length()) {
                        if (sb.charAt(j + 1) == sb.charAt(j + 2)) {
                            // 1、2、3位相等,则遍历后面所有相等的,删除只保留1、2位
                            int temp2 = j + 2;
                            for (int k = j + 3; k < sb.length() && sb.charAt(j + 2) == sb.charAt(k); k++) {
                                temp2 = k;
                            }
                            sb.delete(j + 2, temp2 + 1);
                            // 重新检测是否有AABB问题
                            j--;
                        } else {
                            // 1、2位相等,3位不相等
                            int temp1 = -1;
                            // 记录3、4位以及后面的是否相等,若相等则删除,只保留3位
                            for (int k = j + 3; k < sb.length() && sb.charAt(j + 2) == sb.charAt(k) ; k++) {
                                temp1 = k;
                            }
                            // 
                            if (temp1 != -1) {
                                sb.delete(j + 3, temp1 + 1);
                            }
                        }
                    }
                }
            }
            System.out.println(sb.toString());
        }
    }
}


编辑于 2021-08-22 16:01:20 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            String s = scanner.next();
            StringBuilder str = new StringBuilder(s);
            int len = s.length();
            for (int j = 0; j < len; j++) {
                if (j+2<len && str.charAt(j)==str.charAt(j+1) && str.charAt(j+1) == str.charAt(j+2)){
                    str.deleteCharAt(j);
                    j -=1;
                }else if (j+3<len && str.charAt(j)==str.charAt(j+1) && str.charAt(j+2)==str.charAt(j+3) && str.charAt(j+1)!=str.charAt(j+2)){
                    str.deleteCharAt(j+2);
                    j -=1;
                }
                len = str.length();
            }
            System.out.println(str);
        }
    }
}

发表于 2021-08-20 20:51:06 回复(0)
参考 @小风201812112250658 题解,


提供 Java 版本
import java.util.*;
import java.io.*;
 
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.valueOf(br.readLine());
        for(int i = 0;i<N;i++){
            String str = br.readLine();
            int len = str.length();
            int state = 0; // 状态 0;
            char last = str.charAt(0);
            StringBuilder res = new StringBuilder();
            res.append(str.charAt(0));
            for(int j = 1;j<len;j++){
                char cur = str.charAt(j);
                if(state == 0){
                    state = cur == last ? 1 : 0; 
                }else if(state == 1){  //AA
                    if(cur == last){  // AAA
                        continue; // 忽略
                    }else{ //AAB
                        state = 2;
                    }
                }else if(state == 2){
                    if(cur == last){ // AABB
                        continue;
                    }else{
                        state = 0;
                    }
                }
                res.append(cur);
                last = cur;
            }
            System.out.println(res.toString());
        }
    }
}



发表于 2021-08-18 09:47:29 回复(0)
从 i == 0开始,向前探测 [ i, i + 2 ] 查看是否需要删除,再向前探测[ i, i + 3 ] 查看是否需要删除。当两个窗口都正确后,i++。
剪枝:当剩余元素小于 i + 2 或 i + 3,以及 窗口第 i 个元素和第 i + 1 个元素不相同时,进行剪枝。
public class Main{
     public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        for(int i = 0; i < n; i++){
            String s = input.next();
            String res = verify(new StringBuilder(s));
            System.out.println(res);
        }
    }
    
    public static String verify(StringBuilder s){
        if(s.length() <= 2){
            return s.toString();
        } 
        int i = 0;
        while(i < s.length()){
            if(i + 2 >= s.length()){
                break;
            } 
              // 窗口前2个值不等时,无需处理
            if(s.charAt(i) != s.charAt(i + 1)){
                i++;
                continue;
            }
            if(s.charAt(i + 1) == s.charAt(i + 2)){
                s.deleteCharAt(i + 2);
             // 删除第三个值后,进入下一次循环,重新判断窗口大小为3的情况是否满足
                continue;
            }
            if(i + 3 >= s.length()){
                break;
            }
            if(s.charAt(i + 2) == s.charAt(i + 3)){
                s.deleteCharAt(i + 3);
                continue;
            }
            i++;
        }
        return s.toString();
    }
}


编辑于 2021-03-15 08:59:05 回复(1)
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 数字后面的换行,要记得去掉这个干扰。
        sc.nextLine();
        while(n-- > 0) {
            StringBuffer sb = new StringBuffer(sc.nextLine());
            for(int i = 2; i < sb.length(); i++) {
                if(sb.charAt(i-2) == sb.charAt(i-1) && sb.charAt(i-1) == sb.charAt(i)) {
                    // AAA -> AA
                    sb.deleteCharAt(i);
                    i--;
                }else if(i >= 3 && sb.charAt(i-3) == sb.charAt(i-2) && sb.charAt(i-1) == sb.charAt(i)){
                    // helloo -> hello
                    sb.deleteCharAt(i);
                    i--;
                }
            }
            System.out.println(sb.toString());
        }
    }
}

发表于 2021-02-25 19:18:10 回复(0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
 
/**
 * @Author LakersHao
 * @Date 2021/2/16 10:09
 */
public class Main {
    static Scanner sc = new  Scanner(System.in);
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        int N = sc.nextInt();
        while(N > 0 && sc.hasNext()){
            list.add(sc.next());
        }
        int ind = 0;
        while(N > 0){
            String str = list.get(ind);
            ind++;
            char ch[] = str.toCharArray();
            for(int i = 0;i<ch.length;i++){
                //int j = i+2;
                if(i+1 < ch.length && ch[i] == ch[i+1]){
                    //解决helllo
                    while(i+2 < ch.length &&ch[i+1] == ch[i+2]){
                        for(int k = i+2;k<ch.length-1;k++){
                            ch[k] = ch[k+1];
                        }
                        ch = Arrays.copyOf(ch, ch.length - 1);
                    }
                    //解决helloo
                    while(i+3 < ch.length && ch[i+2] == ch[i+3]){
                        for(int k =i+2 ;k<ch.length-1;k++){
                            ch[k] = ch[k+1];
                        }
                        ch = Arrays.copyOf(ch, ch.length - 1);
                    }
                }
            }
            System.out.println(ch);
            N = N-1;
        }
    }
}

发表于 2021-02-16 13:15:30 回复(0)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int line = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i <line ; i++) {
            StringBuffer str =new StringBuffer(sc.nextLine()) ;
            for (int j = 1; j < str.length()-1 ; ) {
                if (str.charAt(j-1) == str.charAt(j) && str.charAt(j) == str.charAt(j+1)) {
                    str.deleteCharAt(j);
            }else j++;

            }
            for (int j = 2; j < str.length()-1 ; j++) {
                if (str.charAt(j-2) == str.charAt(j-1) && str.charAt(j) == str.charAt(j+1)){
                    str.deleteCharAt(j);
                }

            }
            System.out.println(str);
        }
    }
}

编辑于 2020-12-01 02:45:52 回复(0)
//暴力破解法,太多细节了,调试了很久
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int N = sc.nextInt();
            for (int i = 0; i < N; i++) {
                String str = sc.next();
                List<Character> list = new ArrayList<>(); //存储每个字符
                Character[] repeat = new Character[4]; //记录重复的字母
                int count = 0; //用作计数器
                for (int j = 0; j < str.length(); j++) {  //遍历字符串,并加入List
                    list.add(str.charAt(j));
                    int size = list.size() - 1;  //当前集合的最后索引
                    if (count == 0) {  //第一个字符,不会重复直接入
                        repeat[count++] = list.get(size);
                        continue;
                    }
                    if (count == 1 && list.get(size) == repeat[0]) {//判断第2个字母与前1个字母是否相同,相同则装入
                        repeat[count++] = list.get(size);
                        continue;
                    } else if (count == 2 || count == 3) { //到第3,4个字符时放行

                    } else { //不同则重置数组并放到数组第一位
                        count = 0;
                        repeat[count++] = list.get(size);

                    }
                    if (count == 2 && list.get(size) == repeat[1]) { //破解AAA型
                        list.remove(size);
                        count = 2;

                    } else if (count == 1) {  //count=1 结束本次循环
                        continue;
                    } else if (count == 3) { //到第4个字母时放行

                    } else {
                        repeat[count++] = list.get(size);
                        continue;
                    }
                    if (count == 3 && list.get(size) == repeat[2]) { //破解AABB型
                        list.remove(size);
                        count = 3;
                    } else if (count == 2) { //count=2 结束本次循环
                        continue;
                    } else {
                        count = 0;
                        repeat[count++] = list.get(size);
                    }


                }
                StringBuilder result = new StringBuilder();
                for (Character c : list) {
                    result.append(c);
                }
                System.out.println(result);
            }

        }

    }


}

发表于 2020-09-07 23:33:18 回复(0)
import java.util.Scanner;

/*
 * 
	请听题:请实现大锤的自动校对程序
	输入描述:
		第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。
		后面跟随N行,每行为一个待校验的字符串。
	输出描述:
		N行,每行包括一个被修复后的字符串。
	
	示例1:
		输入
		2
		helloo
		wooooooow
		
		输出
		hello
		woow
 * */
public class 万万没想到之聪明的编辑 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int count = sc.nextInt();
		while(count > 0){
			String str2 = sc.next();
			System.out.println(check(str2));
			count--;
		}
		sc.close();

	}
	
	public static String check(String str){
		StringBuilder sb = new StringBuilder(str.toString());
		for(int j = 2; j < sb.length(); j++){
			//判断是否为AAA型字符串
			if(sb.charAt(j) == sb.charAt(j - 1) && sb.charAt(j - 1) == sb.charAt(j-2)){
				sb.deleteCharAt(j);
				j--;
			}else if(isPattern(sb, j - 3, j)){
				sb.deleteCharAt(j);
				j--;
			}
		}
		return sb.toString();
	}
	
	//判断是不是AABB型字符串
	public static boolean isPattern(StringBuilder sb, int i, int j){
		if(i < 0){
			return false;
		}
		//判断sb[j-3]和sb[j-2]、sb[j-1]和sb[j]是否相等
		return sb.charAt(i) == sb.charAt(i + 1) && sb.charAt(j - 1) == sb.charAt(j);
	}

}

编辑于 2020-07-29 13:24:30 回复(0)
//应该是状态机
//分情况判断
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;i++){
            String str=sc.next();
            int length=str.length();
            if(length<3){
                System.out.println(str);
                continue;
            }
            int flag=0;
            //实时输出
            System.out.print(str.charAt(0));
            for(int j=1;j<length;j++){
                if(flag==1){
                    if(str.charAt(j)==str.charAt(j-1)){
                        //三个相同,本次不打印,状态不变
                    }else{
                        //AAB,打印,状态不变
                        flag=2;
                        System.out.print(str.charAt(j));
                    }
                }else if(flag==2){
                    if(str.charAt(j-1)==str.charAt(j)){
                        //不打印,状态不变
                    }else{
                        //打印,状态为0
                        flag=0;
                        System.out.print(str.charAt(j));
                    }
                }else if(str.charAt(j-1)==str.charAt(j)){
                    //此时状态为零
                    flag=1;
                    System.out.print(str.charAt(j));
                }else{
                    System.out.print(str.charAt(j));
                }
            }
            System.out.println();
        }
    }
}
逻辑很简单,可能我写的不够简洁,欢迎大佬指正
发表于 2020-06-30 08:49:13 回复(0)
我使用的方法有点直,不过完全实现了题目的的要求,包括输入和输出的显示。我看有的人在输入字符串的时候一般是输入一个,再输出一个,我的是会根据你输入的个数生成对应的输入流个数,一次性进行校对。
import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        //接收字符串个数
        int num = sc.nextInt();
        //创建相应字符串个数的输入流
        String[] sr = new String[num];
        for (int i = 0; i < num; i++) {
            sr[i] = sc.next();
        }
        ArrayList<Object> temp = new ArrayList<>();
        for (String s : sr) {
            //将传入的字符串进行分割
            Object[] strings = s.split("");
            //进行校对并输出
            for (int j = 0; j < strings.length; j++) {
                if (j < strings.length - 2) {
                    if (strings[j].equals(strings[j + 1]) && strings[j + 1].equals(strings[j + 2])) {
                        temp.clear();
                        for (int i = 0; i < strings.length; i++) {
                            if(i == j+2){}else{
                                temp.add(strings[i]);
                            }
                        }
                        strings = temp.toArray();
                        j--;
                        continue;
                    }
                }
                if (j > 1 && j < strings.length - 1) {
                    if (strings[j - 2].equals(strings[j - 1]) && strings[j].equals(strings[j + 1])) {
                        temp.clear();
                        for (int i = 0; i < strings.length; i++) {
                            if(i == j+1){}else{
                                temp.add(strings[i]);
                            }
                        }
                        strings = temp.toArray();
                        j--;
                    }
                }
                }
            for (int i = 0; i < strings.length; i++) {
                if (i == strings.length - 1) {
                    System.out.println(strings[i]);
                }else {
                    System.out.print(strings[i]);
                }
            }
        }
        sc.close();
    }
}


发表于 2020-06-28 22:35:00 回复(0)
模拟匹配过程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @Date: 2020-05-05 21:02
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.valueOf(br.readLine());
        for (int i = 0; i < n; i++){
            StringBuilder s = new StringBuilder().append(br.readLine());
            int index = 0;
            while (index < s.length() - 2){
                if (s.charAt(index) == s.charAt(index+1) && s.charAt(index) == s.charAt(index+2)){
                    s.deleteCharAt(index);
                    while (index < s.length() - 2&&s.charAt(index) == s.charAt(index+2))
                        s.deleteCharAt(index);
                }
                if (index < s.length() - 3 && s.charAt(index) == s.charAt(index+1)&&s.charAt(index+2) == s.charAt(index+3)){
                    s.deleteCharAt(index+2);
                    while (index < s.length() - 3 && s.charAt(index+2) == s.charAt(index+3))
                        s.deleteCharAt(index+2);
                    index = index + 3;
                    continue;
                }
                index++;
            }
            System.out.println(s);
        }
    }
}

发表于 2020-05-05 21:54:58 回复(0)
链接:https://www.nowcoder.com/questionTerminal/42852fd7045c442192fa89404ab42e92?toCommentId=5882232
来源:牛客网

//我的比较low,但是为了记录心路历程还是写下了,我是直接暴力检索的
import java.io.*;
import java.util.ArrayList;
 
public class Main {
    public static void main(String arg[]) throws IOException{
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String num = bufferedReader.readLine();
        int theNum = Integer.valueOf(num);
        ArrayList<String> arrayList = new ArrayList<String>(); 
        for(int i=0;i<theNum;i++) {
            String str = bufferedReader.readLine();
            arrayList.add(str);
        }//正常地获取题目所给的参数
         
        for(int i=0;i<theNum;i++) {
            String string = arrayList.get(i);
            String answer = "";
            char before = '1';
            boolean isDanger = false;//就是有可能会删除字母的时候
 
            for(int j=0;j<string.length();j++) {
                if(!isDanger) {
                    //非danger状态可以大胆地直接添加字母
                    answer = answer+string.charAt(j);
                }
                if(before == string.charAt(j)) {  
                   //当出现AA时,就是可能会删除字母的时候
               isDanger = true;
                }else if(isDanger){//数字不相等的情况下进入
                    if(answer.charAt(answer.length()-1) != answer.charAt(answer.length()-2)) {
                        //以前的因为被删除所以需要退出danger状态,例如AABBBCC的AABBB因为被删除为AAB所以,CC不danger
                        answer = answer+string.charAt(j);
                        isDanger = false;
                    }else if(j+1<string.length() && string.charAt(j+1) == string.charAt(j)) {//j+1存在
                        //当出现AABB时,删除BB的一个B并退出danger状态,毕竟AAB之后无论出现啥都添加一个B肯定没错
                        isDanger = false;
                    }else if(j+1 == string.length()) {
                        //如果是AAAAB,B是末尾时,则不考虑出现AAAABB直接添加,毕竟不可能再有一个B出现
                        answer = answer+string.charAt(j);
                    }else if(string.charAt(j+1) != string.charAt(j)) {
                        //如果是AABC则直接退出danger状态
                        answer = answer+string.charAt(j);
                        isDanger = false;
                    }
                }
                before = string.charAt(j);//记录本次的字母用于下次使用
            }
            System.out.println(answer);//输出
        }
         
    }
}

发表于 2020-04-15 11:30:05 回复(0)