阿里Java研發工程師實習生題

import java.util.Scanner;
import java.util.regex.Pattern;


/*
小明中午路過一家公共停車場,出於程序員的職業習慣,他很想知道這個停車場上午的最大化利用率有多少。
經與門衛大叔溝通,他獲得了該停車場上午車輛入場時間與出場時間的記錄表(數據格式參考樣例輸入),
你能通過拿到的數據寫一個函數快速的幫小明算出這家停車場,上午最多的時候同時停放了多少輛車嗎?
要求時間複雜度不高於:O(n)*lgN


注意事項:
1、爲方便起見,簡化計算,駛入時間和開出時間以整點記錄,如9點,10點。
2、如停車記錄中入場時間晚於出場時間,該停車記錄視爲無效,如7,3
3、假定如果有多輛車同時出入場,出場車輛優先。
 
樣例輸入:
8,9;4,6;3,7;6,8 (車輛以分號分隔,車輛入場和出場時間以逗號分隔)
樣例輸出:
2*/
public class Main {


    private static final String carSplit =";";
    private static final String timeSplit =",";
    private static final String regress = "(\\d{1,2},\\d{1,2};)*\\d{1,2},\\d{1,2}$";
    
    public static void main(String[] args) {
        String inString = null;
        // 數據輸入
        Scanner in = new Scanner(System.in);
        inString = in.nextLine();
        //字符串數組格式校驗
        Pattern pat = Pattern.compile(regress);
        if(inString == null || inString.trim().equals("")||!pat.matcher(inString).matches()){
            System.out.println("輸入錯誤!");
            return;
        }
        Main sol = new Main();
        int countCars = sol.countCars(sol.convertToArray(inString));
        System.out.println(countCars);
    }


    //輸入字符串轉數組
    public int[][] convertToArray(String str) {
        String[] strArray = str.split(carSplit);
        int row = strArray.length;
        int col = 2;
        // 字符轉數組判斷
        int[][] carArray = new int[row][col];
        int start,end;
        for (int i = 0; i < row; i++) {
            start = Integer.parseInt(strArray[i].split(timeSplit)[0]);
            end = Integer.parseInt(strArray[i].split(timeSplit)[1]);
            if(start>end){
                continue;
            }
            carArray[i][0] = start;
            carArray[i][1] = end;
        }
        return carArray;
    }
    //核心算法實現
    public int countCars(int[][] carArray) {
        int ans = 0;
        int[] maxarray=new int[12];
        int[] carray=new int[12];
        for(int i=0;i<carArray.length;i++){
        int startcartime =carArray[i][0];
        int endcartime=carArray[i][1];
        for(int j=startcartime;j<endcartime;j++){
        carray[j]++;
    if(maxarray[j]<carray[j]) maxarray[j]=carray[j];
        }
        }
        
        ans=maxarray[0];
        for(int i=0;i<12;i++){
        if(maxarray[i]>ans) ans=maxarray[i];
        }
        
        return ans; // 返回計算結果
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章