PAT 1112 java

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86515489

PAT 1112 java

1. 分析

Pat 1112
you are supposed to list all the possible stucked keys, and the original string.
the characters corresponding to those keys will appear repeatedly on screen for k times.

=> 这句话说明只要是坏键,那么就会重复k次。
=> 如果是坏键,那么在字符串中,连续出现的次数肯定是 nk 次。

键盘有坏键,按下一次会出现k次,现在要你找出这些可能有问题的键,并且将原字符串输出。

2.测试样例

3
ttte_ceee111


3
caseee1__thiiis_iiisss_a_teeeeeest

2
tee_ceeee1

3.java 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        Reader.init(System.in);
        int k = Reader.nextInt();
        String str = Reader.next();

        int[] badKey = new int[50];
        for(int i = 0;i<50;i++) {
            badKey[i] = -1; //初始化
        }
        //-1 初始化
        //1 好
        //0 坏

        //开始遍历处理
        //将可能有问题的字符放在badKey 中。
        char curChar ;//当前处理的字符
        String res="";//最后的字符串
        Set<Character> set = new LinkedHashSet<>();
        for(int i = 0;i< str.length();i++) {
            curChar = str.charAt(i);//依次判断每个字符
            int count = 0;
            while (count < k) {
                if (i + count< str.length() && str.charAt(i + count) == curChar) {//说明是重复的数据
                    count++;
                } else {
                    break;
                }
            }
            if (count % k == 0 && count !=0) {//说明这个字符可能是坏键
                if (badKey[map(curChar)] == -1 ) {//如果之前没有修改过,则设置成-1               
                    badKey[map(curChar)] = 0;
                    set.add(curChar);
                }
                //只要满足倍数情况,那么都要执行 i += k-1
                i+=k-1;//再加2
            } else {//否则,不是坏键
                badKey[map(curChar)] = 1;
                if (set.contains(curChar)) {
                    set.remove(curChar);//移除
                }
            }
        }

        for (char c : set) {
            System.out.print(c);
        }System.out.println();

        //输出正常的结果
        for(int i = 0;i<str.length();i++) {
            if (set.contains(str.charAt(i))) {
                i+=k-1;
            }
            System.out.print(str.charAt(i));
        }
    }
    public static int map(char curChar) {
        if (curChar >= 'a' && curChar <= 'z') {//如果是字符
            return curChar-87;//说明不可能是坏键了
        }
        else if(curChar == '_'){
            return 36;
        }
        else // 0-9 这几个字符
            return (int)curChar - 48;
    }
    public static char reverseMap(int number) {
        if (number >= 10 && number <= 35) {//如果是字符
            return (char)(number+87);//说明不可能是坏键了
        }
        else if(number == 36){
            return '-';
        }
        else // 0-9 这几个字符
            return (char)(number + 48);
    }
}


class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) throws IOException {
        reader = new BufferedReader(new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
    }

    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {//如果后面还有数据,则直接返回
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(reader.readLine() );//否则,读取下一行
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }

    static double nextDouble() throws IOException {
        return Double.parseDouble( next() );
    }

    //获取字符 => 因为 next()方法返回的是一个String
    static char nextChar() throws IOException {
        return next().charAt(0);
    }
}

4.坑点

在用java刷这题时,需要注意的地方有:

  • 01.Set 是无序的,所以会导致输出有问题的键时,可能出现问题。所以这里没有使用HashSet,而是使用LinkedHashSet
  • 02.如果在遍历完成之后,再找出有问题的键,可能会导致顺序不对。应该在发现有问题的时候就插入到set

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86515489
今日推荐