海康威视笔试题

第一题:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

时间限制: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,上级部门ID0,且只有一个根部门;部门数据之间使用分号分隔;部门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-BA-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

题目描述:

有一环形公交站,包含NN>=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);
}

}

}

 

posted @ 2018-03-08 20:43  Bit_bo  阅读(6209)  评论(0编辑  收藏  举报