程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 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);
        }

    }
    
}
 

我使用上述代碼測試了一些數據均可得到正確結果,雖然還有很多可以優化的地方(如代碼冗余等),但此處就不再展示了

貼出幾組測試數據(輸入):

*
**
***
******
*aaa*bb*c*

其對應結果應該如下(輸出):

*
**
**
**
*aaabbc*

 

還有一些其他解決方案應該更為簡單快捷,比如下面這種(注意此方案循環中i的增減控制):

package com.test;

import java.util.Scanner;

public class Test {
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String line=scanner.next();
        StringBuffer str=new StringBuffer(line);
        for(int i=1;i<str.length()-1;i++){
            if(str.charAt(i)=='*'){
                str.deleteCharAt(i);
                i--;
                System.out.println(str.length()); 
            }
        }
        System.out.println(str);        
    }
}

 

原本很簡單的一次機試,其結果卻讓我對自己感到很失望,誓曰:君需更謹慎,此次失誤不可再;君當更努力,夯基迎難不可阻!

感覺此文有些污了諸位大大的眼,請勿見怪哦(~ o ~)~zZ

 

===========看到園友評論,此處貼出java中的字符串分割函數:java.lang.string.split 的簡單使用示例,以飨園友=============

Java中的我們可以利用split把字符串按照指定的分割符進行分割,然後返回字符串數組,下面是string.split的用法實例及注意事項:

 

split() 方法:將一個字符串分割為子字符串,然後將結果作為字符串數組返回

使用方法如下:

stringObj.split([separator,[limit]])

參數解說:

  stringObj:必選項,要被分解的 String 對象或文字,該對象不會被split方法修改。

  separator:可選項,字符串或正則表達式對象,它標識了分隔字符串時使用的是一個還是多個字符。如果忽略該選項,返回包含整個字符串的單一元素數組。

  limit :可選項,該值用來限制返回數組中的元素個數(也就是最多分割成幾個數組元素,只有為正數時有影響) 

 

示例1:

String str="Java string split test"; 
String[] strarray=str.split(" "); 
for (int i = 0; i < strarray.length; i++){
    System.out.println(strarray[i]); 
}

輸出如下:

Java
string
split
test

 

示例2:

String str="Java string split test"; 
String[] strarray=str.split(" ",2);//使用limit,最多分割成2個字符串 
for (int i = 0; i < strarray.length; i++){
    System.out.println(strarray[i]); 
}

輸出如下:

Java
string split test

 

示例3:

String str="192.168.0.1"; 
String[] strarray=str.split("\\."); //注意此處不能寫為String[] strarray=str.split("."); 
for (int i = 0; i < strarray.length; i++) {
    System.out.println(strarray[i]); 
}

輸出如下:

192
168
0
1

 

經驗分享: 

1、若分隔符為“.”、“|”、“*”、“+”等轉義字符時,直接使用str.split(".")會拋出異常,都必須在前面加"\\",如split(\\|); 

2、如果用"\"作為分隔,就得寫成這樣:String.split("\\\\"),因為在Java中是用"\\"來表示"\"的,自定義字符串是這樣的:String Str="a\\b\\c"; 

3、如果在一個字符串中有多個分隔符,可以用"|"作為連字符,比如:String str="Java string-split#test",可以用Str.split(" |-|#")把每個字符串分開; 

4、split 方法的結果是一個字符串數組,在 stingObj 中每個出現 separator 的位置都要進行分解,separator不作為任何數組元素的部分返回。

 

示例4:

String str="192\\168-0.1"; 
String[] strarray=str.split("\\\\|-");
for (int i = 0; i < strarray.length; i++) {
    System.out.println(strarray[i]); 
}

輸出如下:

192
168
0.1

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved