java字符展开_1267: 展开字符串(Java)

WUSTOJ 1267: 展开字符串

参考

jamesMusk的博客——Java 判断字符是大写小写或者数字

Description

给三个参数a1,a2,a3和一个字符串,请按以下要求展开该字符串。

1. 只有当‘-’两侧两个字符同为小写字母或数字,且右边字符的ASCII值大于左边字符时才按要求展开,否则原样输出。

2. 参数a1。

a1=1,填充小写字母;a1=2,填充大写字母;a1=3,填充’*’。

a1=1和a1=2对两侧字符为数字的,无影响(还是填充数字)。比如当a-d,a1=2时展开为aBCd。2-4 a1=2时展开为234。

3. 参数a2。控制填充字符的重复次数(a2>=1)。

比如:a1=2 a2=3 a-d的展开形式为aBBBCCCd。

4. 参数a3。控制填充字符的顺序。

a3=1:顺序填充;a3=2:逆序填充。

比如:a1=1 a2=2 a3=2 a-d的展开形式为accbbd。

Input

多组测试样例。

每组测试样例占两行,第一行三个整数表示三个参数a1,a2,a3.

第二行一个字符串(只含小写字母、数字和‘-’,字符串长度不超过100)。

Output

输出展开后的字符串,每个样例占一行。

Sample Input

1 2 1

bs-w1234-94-saa

3 4 2

aa-ai-ja-cd-g

Sample Output

bsttuuvvw12345566778894-saa

aa-aija****cd********g

分析

题目要求读理清楚是最重要的,最好按顺序写完,穿插着写容易漏洞百出。

在检查是否能展开的时候,第1个和最后1个字符,不用管直接输出,因为这里肯定是不能展开的。

检查用的下标k不能出界,去掉第1个和最后1个。

如果字符串出现类似ab-cd或者12-34的话,输出应该为abcd和1234,即直接去掉-。

代码

/**

* 用时:265ms

* @author PengHao

* @version A1.0

* @date 2019年4月17日 下午4:58:43

*/

import java.util.Scanner;

public class Main {

private Scanner sc;

private int a1, a2, a3; // 参数

private String str; // 输入的字符串

private int len; // 输入的字符串的长度

public Main() {

sc = new Scanner(System.in);

while (sc.hasNext()) {

init(); // 初始化

// 查找‘-’字符

for (int i = 0; i < len; i++) {

// 检查是否能展开

if ('-' == str.charAt(i) && canUnFold(i)) {

unFold(i); // 展开

} else {

// 不能展开,直接输出

System.out.print(str.charAt(i));

}

}

System.out.println(); // 一组数据末尾换行

}

sc.close();

}

/**

* 输入数据

*/

private void init() {

a1 = sc.nextInt();

a2 = sc.nextInt();

a3 = sc.nextInt();

str = sc.next();

len = str.length(); // 字符串长度

}

/**

* @param k '-'在输入的字符串中的下标

* @return true 如果满足展开条件

*/

private boolean canUnFold(int k) {

// 第1个和最后1个不满足要求

if (k > 0 && k < len - 1) {

char a = str.charAt(k - 1); // 前面1个字符

char b = str.charAt(k + 1); // 后面1个字符

// 前1个字符小于后1个字符

if (a < b) {

if (Character.isLowerCase(a) && Character.isLowerCase(b)) {

return true; // 都是小写字母

} else if (Character.isDigit(a) && Character.isDigit(b)) {

return true; // 都是数字

}

}

}

return false; // 否则不能展开

}

/**

* @param k 需要展开的地方的下标

*/

private void unFold(int k) {

char a = str.charAt(k - 1);

char b = str.charAt(k + 1);

char c = 0; // 保存最终输出的字符

int len = b - a - 1; // 扩展部分的字符个数

// i表示要填充的第i个字符,也就是偏移量

for (int i = 1; i <= len; i++) {

// 顺序填充

if (1 == a3) {

// 是小写字母

if (Character.isLowerCase(a)) {

// 获取经过参数a1后,应该输出的字符c

c = parameterA1((char) (a + i));

} else if (Character.isDigit(a)) {

// 是数字

// 填充'*'

if (3 == a1) {

c = '*';

} else {

c = (char) (a + i); // 直接加偏移量得到新数字

}

}

} else if (2 == a3) {

// 逆序填充

// 是小写字母

if (Character.isLowerCase(b)) {

c = parameterA1((char) (b - i)); // 逆序,相对于b的偏移量

} else if (Character.isDigit(a)) {

// 是数字

// 填充'*'

if (3 == a1) {

c = '*';

} else {

c = (char) (b - i); // 直接减偏移量得到新数字

}

}

}

for (int j = 0; j < a2; j++) {

System.out.print(c);

}

}

}

/**

* @param c 准备输出的字符

* @return 经过参数a1的改变后的字符

*/

private char parameterA1(char c) {

switch (a1) {

case 1:

return c; // 1表示输出小写字母,即不变

case 2:

return (char) (c - 32); // 输出大写字母,减去32

default:

return '*'; // 输出'*'

}

}

/**

* @param args

*/

public static void main(String[] args) {

new Main();

}

}

写在最后:

如需转载,请于标题下注明链接形式的wowpH的博客即可。

代码原创,如需公开引用,不能删除首行注释(作者,版本号,时间等信息)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值