zoukankan      html  css  js  c++  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. 题目要求读理清楚是最重要的,最好按顺序写完,穿插着写容易漏洞百出。
    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. 代码原创,如需公开引用,不能删除首行注释(作者,版本号,时间等信息)。
  • 相关阅读:
    dp P1103 书本整理 洛谷
    dp 洛谷P1977 出租车拼车 线性dp
    Layui 在新标签中打开页面 / 模拟点击菜单
    布局 基础知识
    SpreadJS 生成报表
    ABP abp zreo 老版本 支持dotnet framework 4.0
    IIS 加载字体
    IIS 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用
    C# WebForm 打开默认页
    IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL est1'.
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060820.html
Copyright © 2011-2022 走看看