[洛谷每日一题]P1098字符串的展开

这是一道看起来很麻烦。实际也很麻烦的模拟题,题目如下:

思路

第一次遍历字符串,找到每个'-'左右的字符,并记录

第二次遍历字符串,输出'-'以外的字符,'-'用补充的字符串代替输出

有哪些很坑的测试案例

1.'-'在开头出现/在末尾出现,导致第一次遍历出错

2.'--'两个'-'连在一起

3.数字和字母分别在两边

4.左边比右边大

以上几种坑点都是输出原始'-'

用到的Java基础

1.字符串——字符 数字——字符 数字——字符串之间的转换

2.大小写字母之间差了多少ASCII码

3.基本数据结构:链表以及基本操作函数

最终,AC代码如下:

import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		//分别录入三个p值
		int p1=in.nextInt();
		int p2=in.nextInt();
		int p3=in.nextInt();
		//遍历字符串中有多少个'-'    用count计数,利用count设置出存储数组大小        存储每个'-'左右的字符(两个粘在一起,作为链表动态添加)     
		ArrayList<List<String>> array = new ArrayList<List<String>>();
		LinkedList<String> linkedList=new LinkedList<String>();
		LinkedList<String> temp2=new LinkedList<String>();
		//LinkedList<String> others=new LinkedList<String>();
		String str=in.next();
		String temp="";//中间变量
		int count=0;
		int bef=0;int flag=0;//标志着最后一个'-'的位置(从0开始数)
		int []index=new int[100];
		for(int i=0; i<str.length(); i++) {
			if(str.charAt(i)=='-') {
				if(i==0) {
					
				}else if(i+1<str.length() &&(str.charAt(i-1)=='-' || str.charAt(i+1)=='-')) {
					
				}else if(i==str.length()-1 && str.charAt(i)=='-') {
					
				}
				else {
					count ++;
					temp=Character.toString(str.charAt(i-1))+Character.toString(str.charAt(i+1));
					linkedList.add(temp);
					String str1=str;
					flag=i;
				}
			}
		}
		//if(flag==0)others.add(str);
		//String last_others=str.substring(flag+2);
		//if(!last_others.equals("") && flag!=0) others.add(last_others);
		//测试是否能够正常录入'-'前后字符  System.out.println(linkedList);
		for(int i=0; i<count; i++) {//对每个'-'进行填充
			temp="";
			if((int)linkedList.get(i).charAt(1)==(int)linkedList.get(i).charAt(0)) {
				temp2.add(temp);
			}else if((int)linkedList.get(i).charAt(1)>57 && (int)linkedList.get(i).charAt(0)>57) {
				//'-'两边是字母的情况
				if(p1 == 1) {
					for(int j=(int)linkedList.get(i).charAt(0); j<(int)linkedList.get(i).charAt(1); j++) {
						temp+=Character.toString((char)j);
					}
					temp2.add(temp);
				}else if(p1 == 2) {
					for(int j=(int)linkedList.get(i).charAt(0); j<(int)linkedList.get(i).charAt(1); j++) {
						temp+=Character.toString((char)(j-32));
					}
					temp2.add(temp);
				}else if(p1 == 3) {
					for(int j=(int)linkedList.get(i).charAt(0); j<(int)linkedList.get(i).charAt(1); j++) {
						temp+=Character.toString('*');
					}
					temp2.add(temp);
				}
			}else if((int)linkedList.get(i).charAt(1)<58){
				//'-'两边是数字的情况
				if(p1 == 3) {
					for(int j=(int)linkedList.get(i).charAt(0); j<(int)linkedList.get(i).charAt(1); j++) {
						temp+=Character.toString('*');
					}
					temp2.add(temp);
				}else {
					for(int j=linkedList.get(i).charAt(0); j<(int)linkedList.get(i).charAt(1); j++) {
						temp+=Character.toString((char)j);
					}
					temp2.add(temp);
				}
			}else {
				temp2.add(temp);//数字与字母的组合,加一个空的字符串
			}
			
		}
		//System.out.println("linkedList:"+linkedList);
		//System.out.println("temp2"+temp2);
		//System.out.println("others"+others);
		//System.out.println("count"+count);
		//结果输出(结合p2与p3)-----先输出others,再输出'-'————————还需要判断
		int flag2=1;
		int num=0;
		for(int i=0; i<str.length(); i++) {
			if(str.charAt(i)!='-')System.out.print(str.charAt(i));
			
			else if(i==0) {System.out.print("-");}
			else if(i+1<str.length() &&(str.charAt(i-1)=='-' || str.charAt(i+1)=='-'))System.out.print("-");
			else {
				if(i==str.length()-1 || temp2.get(num).equals("")) {
					flag2=0;
					System.out.print("-");
				}
				if(p3==1 && flag2==1) {//顺序输出
					int k=1;
					for(k=1; k<temp2.get(num).length(); k++) {
						for(int j=1; j<=p2; j++)
							System.out.print(temp2.get(num).charAt(k));
					}
				}else if(p3==2 && flag2==1){//逆序输出
					int k=1;
					for(k=temp2.get(num).length()-1; k>=1; k--){
						for(int j=1; j<=p2; j++)
							System.out.print(temp2.get(num).charAt(k));
					}
				}
				num++;
				flag2=1;
			}
		}
	}
}




/*测试案例#7
2 8 2

--09-8-w-er-7h-08w-e7-hc-r890-q7w-eh-rc98-07-q8-ewr-8h-c-8-294-5-dsf--k-h-2-48-3k-h-sd-fq-a
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值