ThoughtWorks19屆秋招內推筆試測試題——總結

ThoughtWorks19屆秋招內推筆試測試題——總結

隨着12點的到來,終於完成了完成了此次內推筆試做業。 隨之,是對於寫做業的過程當中的思惟不完善的懊悔。java

 

題目:在線查看傳送門:https://sendeyo.com/up/d/37d9daf6c4正則表達式

題目描述:數組

[R] [R] [R] [R] [R] [R] [R] [R] [R] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [W] [R] [W] [R] [W] [R] [W] [W] [W] [W] [W] [W] [W] [W] [W] [R] [W] [R] [W] [R] [W] [W] [W] [W] [W] [W] [W] [W] [W] [R] [W] [R] [W] [R] [W] [W] [W] [W] [W] [W] [W] [W] 以上是關係圖,咱們須要輸入兩條指令來生成下面的圖形(字符串): 第一行是迷宮道路網格的尺寸。例如3x3的迷宮爲3 3,而5x4的迷宮爲54 (5行4列)。第二行是迷宮道路網格的連通性定義。若是cel1(0,1)  和cell(0,2) 是連通的,則表示爲:0,1 0,2,多個連通以分號;隔開。 例如,若是給定輸入: 3 3. 0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1 [W] [W] [W] [W] [W] [W] [W] [W] [R] [W] [R] [R] [R] [W] [W] [R] [W] [R] [W] [R] [W] [W] [R] [R] [R] [R] [R] [W] [W] [W] [W] [R] [W] [R] [W] [W] [R] [R] [R] [W] [R] [W] [W] [W] [W] [W] [W] [W] [W] 
題目

我在此次筆試犯下的最大的錯誤就是,對於**連通性檢測功能**正則的書寫,未能考慮到多位數的出現。ide

 

個人錯誤寫法:"[0-9],[0-9] [0-9],[0-9]"這個致使不能輸入多位數,意味着,聯通指令出現>10的時候,將報錯。工具

正確寫法:"\\d+,\\d+ \\d+,\\d+"  固然,除此以外還有不少細節要處理,可是都沒有這個正則重要。測試

 

下面是代碼: Grid.javathis

package entity; /** * Grid實體,用於建立Grid對象 * @author xanwidtf@foxmail.com * */
public class Grid { private int m; private int n; String[][] arr; public Grid(){ } public Grid(int m,int n,String s) { this.m=m; this.n=n; this.arr=new String[m][n]; for(int i=0;i<arr.length;i++) { for(int j=0;j<arr.length;j++) { arr[i][j]=s; //System.out.print(arr[i][j]+" "); //調試輸出
 } //System.out.println();
 } } public int getM() { return m; } public void setM(int m) { this.m = m; } public int getN() { return n; } public void setN(int n) { this.n = n; } public String[][] getArr() { return arr; } public void setArr(String[][] arr) { this.arr = arr; } }
Grid.java

util.javaspa

package util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 工具類 * 1.3,完美 * @author xanwidtf@foxmail.com * */
public class util { //初始化渲染網格的方法
        public static String[][] constructGrid(String[][] s,String[][] b){ String[][] small=s;        //道路網格
            String[][] big=b;        //渲染網格
            for(int i=0;i<small.length;i++) { for(int j=0;j<small.length;j++) { if(small[i][j]=="[R]") big[i*2+1][j*2+1]="[R]"; } } return big; } /** * 給輸入的道路網格​的連通性定義進行格式檢查, * 是否包含英文字母和漢字 * @param s * @return true爲包含,false爲不包含 */
        public static boolean containsABC(String s){ Pattern p = Pattern.compile("^[A-Za-z0-9\u4e00-\u9fa5]+$");//定義規則 ,該規則爲大小寫字母
            Matcher m = p.matcher(s); return m.find(); } /** * 判斷是否含有特殊字符",;"和空格3個不包含在內 * * @param s * @return true爲包含,false爲不包含 */
        public static boolean isSpecialChar(String s) { String regEx = "[_`~!@#$%^&*()+=|{}':'\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:」「’。,、?]|\n|\r|\t"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(s); return m.find(); } /** * 經過正則表達式的方式獲取字符串中特定字符的個數 * @param text 指定的字符串 * @return 指定字符的個數 */
        public static int pattern(String command,String str) { // 根據指定的字符構建正則
            Pattern pattern = Pattern.compile(str); // 構建字符串和正則的匹配
            Matcher matcher = pattern.matcher(command); int count = 0; // 循環依次往下匹配
            while (matcher.find()){ // 若是匹配,則數量+1
                count++; } return count; } /** * 匹配特定規則 * @param command * @param str * @return 符合即返回true */
        public static boolean patternMain(String command,String str) { // 根據指定的字符構建正則
            Pattern pattern = Pattern.compile(str); // 構建字符串和正則的匹配
            Matcher matcher = pattern.matcher(command); return matcher.matches(); } /** * 網格聯通指令格式檢測 * @param s * @return 正確返回true */
        public static boolean commandCheck(String s){ boolean result=false; int num=pattern(s,";"); String[] arr=new String[num+1]; if(!util.containsABC(s)&&!util.isSpecialChar(s)){    //s只能爲
                if(num>0) { arr=s.split(";"); //System.out.println(arr.length); //調試輸出
                    if(arr.length>0&&arr.length>num){ for(int i=0;i<arr.length;i++) { if(arr[i]==null||!arr[i].equals("")){    //判斷不容許出現空值
                                result=patternMain(arr[i],"\\d+,\\d+ \\d+,\\d+"); }else{ //System.out.println("出現空值"); //調試輸出
                                return false;    //若是用result=false,有可能在for循環後變爲true
 } } } else{ return false; } }else { result=patternMain(s,"\\d+,\\d+ \\d+,\\d+"); } }else{ return false; } return result; } /** * 聯通性檢測 * @return
         */
        public static boolean Maze(String s,int m,int n){ boolean result=true; String str=s.replaceAll("\\D+",""); //System.out.println("連通性測試:"+str); //調試輸出
            for(int i=0;i<str.length();i=i+4) { int x=Integer.parseInt(String.valueOf(str.charAt(i)));    //0
                int y=Integer.parseInt(String.valueOf(str.charAt(i+2)));    //2
                int xx=Integer.parseInt(String.valueOf(str.charAt(i+1)));    //1
                int yy=Integer.parseInt(String.valueOf(str.charAt(i+3)));    //3
                if(x==y||xx==yy){ //System.out.println(" "+x+y+" "+xx+yy); //調試輸出
                    if(x<m&&y<n&&xx<m&&yy<n&&Math.abs(x-y)<(m-1)&&Math.abs(xx-yy)<(n-1)){//座標值不能超過行列的值,而且,兩座標距離不能超過行、列的下標的值,不然沒法聯通
                        result=true; }else{ result=false; } }else{ return false; } } return result; } /** * 經過提取連通性指令的有效數值,渲染網格 * @param s * @param arr * @return 返回一個二維數組 */
        public static String[][] drawGrid(String s,String[][] arr){ String[] temp=s.split(";"); String[] Temp=new String[temp.length]; for(int j=0;j<Temp.length;j++) { Temp[j]=temp[j].replaceAll("\\D+",""); } for(int i=0;i<Temp.length;i++) { int k=0; int x = 0,y = 0; if(Temp[i].charAt(k)==Temp[i].charAt(k+2)){ x=Integer.parseInt(String.valueOf(Temp[i].charAt(k)))*2+1; y=Integer.parseInt(String.valueOf(Temp[i].charAt(k+1)))*2+1+1; //System.out.println("xy"+x+" "+y); //調試輸出
                    arr[x][y]="[R]"; } else if(Temp[i].charAt(k+1)==Temp[i].charAt(k+3)){ x=Integer.parseInt(String.valueOf(Temp[i].charAt(k)))*2+1+1; y=Integer.parseInt(String.valueOf(Temp[i].charAt(k+1)))*2+1; //System.out.println("xy"+x+" "+y); //調試輸出
                    arr[x][y]="[R]"; } } return arr; } /** * 打印輸出數組 * @param arr */
        public static void printGrid(String[][] arr){ for(int i=0;i<arr.length;i++) { for(int j=0;j<arr.length;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } } }
util.java

finalMain.java調試

package Main; import java.util.Scanner; import entity.Grid; import util.util; public class finalMain { public static void main(String[] args) { while(true) { int m,n=0; try{ //System.out.println("輸入兩位整數,初始化道路網格尺寸(如:3 3):"); //調試輸出
                Scanner sc=new Scanner(System.in); m=sc.nextInt();    //m
                n=sc.nextInt();    //n //System.out.println("您的輸入爲:"+m+" "+n); //調試輸出 //判斷道路網格尺寸大小
                if(m<2||n<2) { System.out.println("Number out of range."); System.out.println("請從新輸入!");    //調試輸出
                    continue; } //輸入連通性指令 //System.out.println("輸入道路網格​的連通性指令:"); //調試輸出
                Scanner sc2=new Scanner(System.in); String s=sc2.nextLine();    //道路網格​的連通性定義 //連通指令格式檢測
                if(!util.commandCheck(s)) { System.out.println("Incorrect command format."); System.out.println("請從新輸入!");    //調試輸出
                    continue; }else { //System.out.println("您輸入的聯通指令爲:"+s);
 } //連通性檢測,不經過則重來
                if(!util.Maze(s,m,n)){ System.out.println("Mazeformat error."); System.out.println("請從新輸入!");    //調試輸出
                    continue; } //System.out.println("初始化數組爲:"); //調試輸出
                Grid roadGrid=new Grid(m,n,"[R]");    //建立道路網格數組,用R字符
                Grid renderGrid=new Grid(m*2+1,n*2+1,"[W]");    //建立渲染網格數組,用W字符 //System.out.println("初始化的渲染網格數組爲:");
                String[][] arr=util.constructGrid(roadGrid.getArr(), renderGrid.getArr()); //執行聯通指令 drawGrid
 util.drawGrid(s,arr); //輸出渲染網格數組
 util.printGrid(arr); sc.close(); sc2.close(); break; } catch(Exception e) { System.out.println("Invalid number format."); break; } } } }
finalMain.java

 

歡迎各位大佬對代碼指點、改進。^O^code

相關文章
相關標籤/搜索