第一題:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
時間限制:C/C++ 語言 2000 MS; 其他語言 4000MS
內存限制:C/C++ 語言 65536KB; 其他語言 589824KB
題目描述:
小A在某公司上班,公司包含的部門比較多,請根據已知的數據對應關系把他們的公司部門對應關系列出來。
舉例說明:
比如公司部門的數據對應關系如下,已按照部門層級排序:
ID 名稱 上級部門ID
1 公司A 0
2 人力資源部 1
3 薪酬福利部 2
4 招聘部 2
列出部門的關系如下:
公司A---人力資源部---薪酬福利管理部門; 公司A---人力資源部門---招聘部
輸入
一行字符串:1,A,0;2,B,1;3,C,2;4,D,2
1,A,0分別表示部門ID、部門名稱、上級部門ID;第一層級部門ID固定為1,上級部門ID為0,且只有一個根部門;部門數據之間使用分號分隔;部門ID和上級部門ID關聯正確
要求至少輸入三個部門。
如輸入條件不滿足,則輸出“incorrect data”
輸出
A-B-C;A-B-D
樣例輸入
1,A,0;2,B,1;3,C,1
1,A,0;B,1,2;
1,A,0;2,B,1;3,C,2;4,D,2
2,A,0;1,B,1;3,C,2
樣例輸出
A-B;A-C
incorrect data
A-B-C;A-B-D
incorrect data
應該是我算法能力還太弱,后面的邏輯實在沒思路,暫且放着,以后來處理
public class Main {
// 一行字符串:1,A,0;2,B,1;3,C,2;4,D,2
//
// 1,A,0分別表示部門ID、部門名稱、上級部門ID;第一層級部門ID固定為1,上級部門ID為0,且只有1個根部門;部門數據之間使用分號分隔;部門ID和上級部門ID關聯正確
//
// 要求至少輸入三個部門。
//
// 如輸入條件不滿足,則輸出“incorrect data”
public char [][] stringParse(String stringArray) {
// String stringArray = "1,A,2;3,B,5;6,C,8";
String[] spiltString = stringArray.split(";");
char [][] charArray = new char[spiltString.length][];
for (int i =0; i<spiltString.length; i++) {
String[] spiltStringComma = spiltString[i].toString().split(",");
charArray [i] = new char[spiltStringComma.length];
for (int j =0; j<spiltStringComma.length; j++) {
charArray [i][j] = (spiltStringComma[j].toString()).charAt(0);
}
}
return charArray;
}
public String choose(char [][] charArray) {
String result = "incorrect data";
StringBuffer resultString = new StringBuffer();
for (int i =0; i < charArray.length; i++) {
if (
(charArray[i][0] < '0'|| charArray[i][0]> '9')
&& (charArray[i][1] < 'A'|| charArray[i][1]> 'Z')
&& (charArray[i][2] < '0'|| charArray[i][2]> '9')) {
return result;
}
for (int j = 0; j <charArray[i].length; j++) {
if (charArray[i][j] < charArray[i][j+1]) {
if (j == charArray[i].length) {
resultString.append(charArray[2][0]);
} else {
resultString.append(charArray[2][0]);
resultString.append('-');
}
} else {
return result;
}
}
resultString.append(";");
}
return resultString.toString();
}
public String judgeString(String stringArray) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < stringArray.length(); i+=6) {
if (
(stringArray.charAt(i) >= '0' && stringArray.charAt(i) <= '9') //部們ID為數字
&& (stringArray.charAt(i+2) >= 'A' && stringArray.charAt(i+2) <= 'Z') //部門名稱為字母
&& (stringArray.charAt(i+4) >= '0' && stringArray.charAt(i+4) <= '9') //上級部門ID為數字
&& (stringArray.charAt(i) != stringArray.charAt(i+4))
&& (stringArray.length() > 18)) { //要求至少輸入三個部門。
//再去比較部門
// for (int j = 4+i*6; j < stringArray.length()-i; j++) {
// if (stringArray.charAt(j) == stringArray.charAt(i)) {
// result.append(stringArray.charAt(j-1));
// result.replace(j, j+1, Character.toString((stringArray.charAt(4+i*6))));
// break;
// } else {
// result.replace(result.length()-3, result.length()-2, ";");
// }
// }
continue;
} else {
result = new StringBuffer("incorrect data");
}
}
return result.toString();
}
public static void main (String[] args) {
Main test = new Main();
System.out.println(test.judgeString("1,A,0;2,B,1;3,C,1"));
System.out.println(test.judgeString("1,A,0;B,1,2;"));
System.out.println(test.judgeString("1,A,0;2,B,1;3,C,2;4,D,2"));
System.out.println(test.judgeString("2,A,0;1,B,1;3,C,2"));
}
}
第二題:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
公交行駛時間計算
時間限制:C/C++ 語言 1000 MS; 其他語言 3000MS
內存限制:C/C++ 語言 65536KB; 其他語言 589824KB
題目描述:
有一環形公交站,包含N(N>=3)個站點【站點序號:1...N】,每個站點停留5分鍾,相鄰兩個站點之間行駛時間都是10分鍾,循環行駛,已知第一圈第一個站點的進入時間為X,現在公交行駛時間為Y,請計算當前公交行駛的圈數,以及在哪個站點之間M-N【如果是停在某個站點Z,則輸出Z-Z】。
輸入
一行字符串:3,2017-07-25 06:00:00,2017-07-25 06:06:00
3,2017-07-25 06:00:00,2017-07-25 06:05:00【整數、時間字符串、時間精確到分鍾】分別表示站點數,第一圈第一個站點的進入時間,目前時間;數據之間使用逗號分隔;
要求至少三個站點。
如輸入條件不滿足,則輸出“incorrect data”
輸出
1;1-2
數據表示:公交正在行駛第一圈,在第一個站點和第二個站點之間;圈數與行駛站點時間使用分號分隔
如果是1;2-2則表示公交正在行駛第一圈,目前停留在第二個站點
樣例輸入
3,2017-07-25 06:00:00,2017-07-25 06:40:00
3,2017-07-25 06:00:00,2017-07-25 08:45:00
1,2017-07-25 06:00:00,2017-07-25 06:40:00
3,2017-07-25 06:00:66,2017-07-25 06:40:09
樣例輸出
1;3-1
4;3-3
incorrect data
1;3-1
---------------------------------------------------------------------------------
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class BusTime {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String[] ss = s.nextLine().split(",");
// String[] ss = "3,2017-07-25 06:00:00,2017-07-25 06:40:00".split(",");
int n = Integer.valueOf(ss[0]);
Date date_start=null;
Date date_end=null;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date_start = format.parse(ss[1]);
date_end = format.parse(ss[2]);
} catch (ParseException e) {
e.printStackTrace();
}
long min = (date_end.getTime()-date_start.getTime())/(1000*60); //得到間隔的分鍾數
if(n<3 || min<0){
System.out.println("incorrect data");
return;
}
long q_Num = min / (15 * n); //圈數
long le_min = min % (15 * n); //q_Num圈之后剩余的分鍾數
// System.out.println(le_min);
long a = le_min / 15; //剩余多少分鍾所走的戰術
long b = le_min % 15; //經過最后一個站點之后的剩余
// System.out.println(a +"***"+b);
System.out.print((q_Num+1)+";");
if(b>=0 && b<=5){
System.out.println((a%n+1)+"-"+(a%n+1));
}else{
System.out.println((a%n+1)+"-"+(a%n+2)%n);
}
}
}
