阿里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; // 返回計算結果
}
}
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; // 返回計算結果
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.