上次看到一个博友列出了他在华为的机试题,其中一道对我来说印象深刻。题目大概的意思是:输入一串字符串。如果该字符串 以*开头或结尾,照常输出,如果*存在字符串中间,则去除* 。
这套机试题乍看一下觉得简单,做起来的时候,如果了解split的用法的话,也会相对简单。
下面我贴出我的代码:
/** 输入一串字符串。如果该字符串 以*开头或结尾,照常输出,如果*存在字符串中间,则去除* 例: input: **24ljl(**dsfds* output:**24ljl(**dsfds
* @param args
*/
public static void main(String[] args) {
System.out.println(getSplitString(getScannerString(),"*"));
}
public static String getScannerString(){
System.out.println("please input a String:");
Scanner scan=new Scanner(System.in);
String string=scan.next();
scan.close();
return string;
}
public static String getSplitString(String string,String regex){
int leftindex=0;
int rightindex=0;
String left="";
String right="";
while(string.startsWith("*")){
string=string.substring(1, string.length());
leftindex++;
}
while(string.endsWith("*")){
string=string.substring(0, string.length()-1);
rightindex++;
}
String connect="";
String[] outp=string.split("\\"+regex); // 出错所在
for(int i=0;i<outp.length;i++){
connect=connect+outp[i];
}
for(int i=0;i<leftindex;i++){
left=left+"*";
}
for(int i=0;i<rightindex;i++){
right=right+"*";
}
return left+connect+right;
}
上面一串代码是在出错两次的情况下整理出来的,总共花了15分钟左右。
第一次出错的时候,写的代码
String[] outp=string.split(regex); // 出错所在
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character \'*\' near index 0
*
^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at com.main.ArrayTest.getSplitString(ArrayTest.java:37)
at com.main.ArrayTest.main(ArrayTest.java:12)
如果英语水平过得去的博友,这个意思应该立马了解,就是分割符*这个参数语法出错。
立马意识到该字符属于特殊字符,需要用到转义字符\\。
这个问题解决之后,后面的都是水到渠成。
写这篇,
一则是做个记录,
二则是告诫自己,和华为这些大型公司招收的标准还远,需要努力,