这是一道看起来很麻烦。实际也很麻烦的模拟题,题目如下:
思路
第一次遍历字符串,找到每个'-'左右的字符,并记录
第二次遍历字符串,输出'-'以外的字符,'-'用补充的字符串代替输出
有哪些很坑的测试案例
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
*/