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. 题目要求读理清楚是最重要的,最好按顺序写完,穿插着写容易漏洞百出。
  2. 在检查是否能展开的时候,第1个和最后1个字符,不用管直接输出,因为这里肯定是不能展开的。
  3. 检查用的下标k不能出界,去掉第1个和最后1个。
  4. 如果字符串出现类似ab-cd或者12-34的话,输出应该为abcd1234,即直接去掉-

代码

/**
* 用时: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();
}
}

写在最后:

  1. 如需转载,请于标题下注明链接形式的wowpH的博客即可。
  2. 代码原创,如需公开引用,不能删除首行注释(作者,版本号,时间等信息)。

1267: 展开字符串(Java)的更多相关文章

  1. 展开字符串(dfs)

    展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. (DFS)展开字符串 -- hdu -- 1274

    http://acm.hdu.edu.cn/showproblem.php?pid=1274 展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. HDU 1274 展开字符串 (递归+string类)

    题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<st ...

  4. 基于opencv将视频转化为字符串Java版

    基于opencv将视频转化为字符串Java版 opencv java  先上一个效果图吧 首先,弄清一下原理 我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化 ...

  5. 编程提取字符串"Java is a programming language"中的各个单词,并打印输出。

    import java.lang.String; import java.util.StringTokenizer; public class StringGetWord{ /* 编程提取字符串&qu ...

  6. Day_09【常用API】扩展案例8_计算字符'j'和字符串'java'在字符串中出现的次数

    需求说明 定义如下字符串: String str = "javajfiewjavajfiowfjavagkljjava"; 请分别定义方法统计出: 1.字符串中:字符j的数量 2. ...

  7. Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)

    ** 算法训练 字符串的展开 ** 题目: 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h" ...

  8. 字符串--java中判断字符串是否为数字的方法的几种方法?

    ava中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...

  9. java----构造回文字符串java(动态规划)【手写演算残图】

    问题描述 草稿解决过程 (字丑别喷) 代码实现 import java.util.Scanner; /** * Created by Admin on 2017/3/26. */ public cla ...

随机推荐

  1. 小程序开发--WePy框架

    现如今mvvm框架如此火热,其核心思想即js逻辑层不直接操作DOM,只改变组件状态:而视图层则通过模板template进行渲染. 1.WePy项目的目录结构 ├── dist 小程序运行代码目录 ├─ ...

  2. Android Studio如何删除一个Module

    当你想在Android Studio中删除某个module时,大家习惯性的做法都是选中要删除的module,右键去找delete.但是在Android  Studio中你选中module,右键会发现没 ...

  3. WORD转HTML-python第三方包Mammoth(官方文档翻译)

    Mammoth 官方 Mammoth可用于将.docx文档(比如由Microsoft Word创建的)转换为HTML.Mammoth致力于通过文档中的语义信息生成简洁的HTML,而忽略一些其他细节.例 ...

  4. python3 各种编码转换

    在做CTF密码题时很大的坑点就在编码,中间有一个弄错就出不来结果.正好python在这块比较坑,记录一下.以下是各种需求对应的输出: 1. 字符串转16进制ascii码串: txt='ABC' new ...

  5. 性能测试工具gperftools使用

    https://blog.csdn.net/10km/article/details/83820080 https://blog.51cto.com/wulingdong/2043898 https: ...

  6. Code First 迁移----官方 应用程序启动时自动升级(MigrateDatabaseToLatestVersion 初始值设定项)

    Code First 迁移 如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数 ...

  7. Apache 后台服务器(主要处理php及一些功能请求 如:中文url)   Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)   Lighttpd 图片服务器   总体来说,随着nginx功能得完善将使他成为今后web server得主流。

    Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着ngi ...

  8. angular 中数据循环 *ngFor

    <!--The content below is only a placeholder and can be replaced.--> <div style="text-a ...

  9. IO流的标准处理代码

    FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("aaa.t ...

  10. 一个漂亮的输出MySql数据库表结构的PHP页面

    经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...