你的位置:首页 > Java教程

[Java教程]华为机试题——该警醒了,骚年


因一次机试,随便写些东西,以此次之失误鞭策自己,水贴一篇,没什么知识分享,大神们请回避O(∩_∩)O哈哈~

 

2016.03.27下午参加华为机试,简单扫了一眼几个题的标题,选择了一道字符串问题,其实该题非常非常的简单,可以说是简单的不能再简单了,而且有很多种解法,上机时我选择了直接借用java提供的一些函数,以为自己能很快解决问题,结果却卡了很久,机子上测试时一直没能通过

晚上回到寝室,改了一下前面的代码,解题方法没变,经测试应该是正确的

 

具体题目记不大清楚了,题目大意是:输入一字符串,若该字符串中间包含"*",去掉"*"后输出;若该字符串首字符或尾字符为"*",则保留该处的"*";若该字符串不包含"*"或包含其他字符,可直接输出

(是不是简单的不要不要的)

第一次提交代码如下(主要部分):

 

针对上述代码,在机子上测试时一直没通过,且针对如下测试数据有如下的报错,定位到代码中第29行,一直没弄明白为什么报错。

 

在很长时间没找到错误的情况下,就有了第一次提交

提交之后显示答案错误,于是简单看了一下提交的代码,发现编码时的辅助输出语句没有注释掉,注释掉了那一句辅助输出语句就第二次提交了,依然显示答案错误,此时不敢轻易提交了

反复改来改去,突然想起了星号(*)是特殊字符,修改之后测试时依然不能输出正确结果,此时代码如下:

 

因为花了很长时间这道题还没做出来有些慌乱,于是暂时放着去做第三题了,第三题依然简单的不要不要的,做完第三题回头再来看这道题目,过了好久还是没能解决这个问题,此时脑袋有些糊涂了以至于忘了只有三次提交机会,又提交了一次,结果可想而知

这之后点开第一题,有一些思路,但感觉正确解题估计得花一段时间,此时机房内小伙伴们已经走了不少,距考试结束已经没多少时间了,再者心情有些低落,放弃了继续作答

 

总结这次机试失误之因:

(1)粗心:

  A.开始选择做这个字符串的题目之前没有将几个题分别简单地浏览一遍,不然肯定会先做第三题,因为该题简单不得了,要知道做出一题之后肯定会自信不少,且心态肯定会平静很多

  B.一些编码时的辅助输出语句,提交时没注释掉,浪费一次作答机会(每题只可提交三次)

(2)基础不够扎实:

  A.对一些函数不熟悉,刚开始使用split()方法来分割字符串时没注意到星号(*)是特殊字符

  B.将split()方法返回的字符串数组转换为字符串时出错,我在代码中直接打印输出该字符串数组:System.out.print(line.split("\\*"));

(3)心态不好:

  A.当花很长时间还没有解决出现的问题时没有及时放弃原来的解题方法,尽管此时我知道还有什么方法可以用来解答该问题

  B.因长时间没有找到出错的原因而有些慌张,对运行输出的非预期结果或报的错误没有进行很细致的分析就忙着去修改代码,且前后测试没有使用同一数据,以至于每次错误定位到不同的代码行(应该是这次机试最大的失误吧),然而却不知道此时自己离成功只有一步之遥,只需要修改原代码将split()方法返回的字符串数组进行遍历拼接转换为字符串即可

 

晚上修改后代码如下:

package com.test;import java.util.*;public class Main {    /** Creates a new instance of Main */  public Main() {  }  public static void main(String[] args) {        Scanner scanner=new Scanner(System.in);    String line=scanner.next();//   System.out.println("输入的字符串是:"+line);        if(line.contains("*")){//字符串中包含"*"//     System.out.println("字符串中包含*");      if(line.startsWith("*")||line.endsWith("*")){//字符串在首尾位置包含"*"                int end=line.length();        if(end==1){//字符串包含"*",且其长度为1          System.out.print(line);        }else{          String ss="";          if(line.startsWith("*")&&line.endsWith("*")){            String strarray=line.substring(1,end-1); //           System.out.print("子串为:"+strarray);            String[] str=strarray.split("\\*");                         for(int i=0;i<str.length;i++){              ss+=str[i];            }            System.out.print("*"+ss+"*");          }          if(line.startsWith("*")&&!line.endsWith("*")){            String strarray=line.substring(1,end); //           System.out.print("子串为:"+strarray);            String[] str=strarray.split("\\*");                         for(int i=0;i<str.length;i++){              ss+=str[i];            }            System.out.print("*"+ss);          }          if(!line.startsWith("*")&&line.endsWith("*")){            String strarray=line.substring(0,end-1); //           System.out.print("子串为:"+strarray);            String[] str=strarray.split("\\*");                         for(int i=0;i<str.length;i++){              ss+=str[i];            }            System.out.print(ss+"*");          }        }              }else{//字符串中包含"*",但不在首尾位置        System.out.print(line.replaceAll("\\*",""));      }          }else{//字符串中不包含"*"      System.out.print(line);    }  }  } 

上述代码测试一些数据都没问题,虽然还有很多可以优化的地方,但此处就不再展示了

感觉此文有些污了诸位大大的眼,请勿见怪(~ o ~)~zZ