字符串的展开(洛谷P1098题题解,Java语言描述)

题目要求

P1098题目链接
在这里插入图片描述
在这里插入图片描述

分析

这题最令我崩溃的是各种特殊情况,特别是结尾部分的处理。

p1、p2、p3 的操作要处理好,但真正恶心的就是如何判断是可以处理的。

  • 数值和字母不能补全
  • 两边相同的数字or字母不能补全
  • 左边大于右边不能补全
  • 连续-号无效
  • ……

获取的测试数据

(由于题做完很久,所以不记得Debug的过程了,抱歉,只能分享一些测试数据啦)
测试数据2
in

1 1 1
abcde

out

abcde

测试数据4
in

2 2 2
9-a-a

out

9-a-a

测试数据5
in

1 5 1
-254-243-52-345-243-5234-52-345-234-52-345-234-52345-4325-2345-2345-2345

out

-254-2434444452345-24344444523452345-23452345-23452345-4325-2345-2345-2345

测试数据6
in

1 1 1
2-43-sdf-ewr0-j-9re-j0g-9e0-9as-d09jf-9asdjf0q-w-ejr0q-59jdsnf-9z-x9v0-sd9fn--q

out

2343-sdf-ewr0-j-9refghij0g-9e0123456789as-d09jf-9asdjf0qrstuvw-ejr0q-59jdsnf-9z-x9v0-sd9fn--q

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {

    private static boolean isTypeEqual(char var1, char var2) {
        return (var1 < var2) && ((Character.isDigit(var1) && Character.isDigit(var2)) ||
                (Character.isLowerCase(var1) && Character.isLowerCase(var2)));
    }

    private static void generateAppendString(char from, char to, StringBuilder result, int times,
            boolean isStar, boolean isUpper, boolean isReversed) {
        if (isReversed) {
            for (char i = (char)(to-1); i > from; i--) {
                char add = isStar ? '*' : (Character.isDigit(i) ? i : ((isUpper ? (char)(i-32) : i)));
                for (int j = 0; j < times; j++) {
                    result.append(add);
                }
            }
        } else {
            for (char i = (char)(from+1); i < to; i++) {
                char add = isStar ? '*' : (Character.isDigit(i) ? i : ((isUpper ? (char)(i-32) : i)));
                for (int j = 0; j < times; j++) {
                    result.append(add);
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int p1 = scanner.nextInt(), p2 = scanner.nextInt(), p3 = scanner.nextInt();
        boolean isStar = p1 == 3;
        boolean isUpper = p1 == 2;
        boolean isReversed = p3 == 2;
        String line = scanner.next();
        scanner.close();
        StringBuilder result = new StringBuilder();
        char[] chars = line.toCharArray();
        for (int i = 0; i < line.length()-2; i++) {
            result.append(chars[i]);
            if (chars[i+1] == '-') {
                if (isTypeEqual(chars[i], chars[i+2])) {
                    generateAppendString(chars[i], chars[i+2], result, p2, isStar, isUpper, isReversed);
                    ++i;
                } else {
                    result.append(chars[++i]);
                }
            }
        }
        if (chars[line.length()-2] != '-' || chars[line.length()-3] == '-') {
            result.append(chars[line.length()-2]);
        }
        result.append(chars[line.length()-1]);
        System.out.println(result);
    }
}
发布了690 篇原创文章 · 获赞 1476 · 访问量 67万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104832722
今日推荐