1+1+1+0.5+0
希望能给我个面试机会(offer就不妄想了)
第一题:产品经理
思路:暴力
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int h = 0;
int w = 0;
List<String[]> list = new ArrayList<>();
while(in.hasNextLine()) {
h++;
String s = in.nextLine();
String[] ss = s.split(" ");
w = ss.length;
list.add(ss);
}
int[][] matrix = new int[h][w];
for(int i = 0; i <h ; i++) {
String[] s = list.remove(0);
for(int j = 0; j < w; j++) {
matrix[i][j] = Integer.valueOf(s[j]);
}
}
int time = 0;
boolean chg = false;
List<Integer> ll = new ArrayList<>();
while(true) {
chg = false;
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
if(matrix[i][j] == 1 && (matrix[Math.max(0, i-1)][j] == 2 || matrix[i][Math.max(0, j-1)] == 2 || matrix[Math.min(i+1, h-1)][j] == 2 || matrix[i][Math.min(w-1, j+1)] == 2)) {
ll.add(i);
ll.add(j);
}
}
}
while(!ll.isEmpty()) {
int i = ll.remove(0);
int j = ll.remove(0);
matrix[i][j] = 2;
chg = true;
}
if(!chg) break;
else time ++;
}
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
if(matrix[i][j] == 1) {
System.out.println(-1);
return;
}
}
}
System.out.println(time);
}
}
第二题:猫奴
思路:这题用python,因为python有tuple,直接用dict就完事了。用java的话,还要自己重写hashCode和equals,就非常麻烦。
N = int(input())
for i in range(N):
M = int(input())
act_dic = {}
max_ = 0
for j in range(M):
act_per = list(map(int, input().split(' ')))
n_act = act_per[0]
for k in range(n_act):
if tuple(act_per[2*k+1:2*k+3]) not in act_dic:
act_dic[tuple(act_per[2*k+1:2*k+3])] = [1, j]
else:
if j == act_dic[tuple(act_per[2*k+1:2*k+3])][1] + 1:
act_dic[tuple(act_per[2*k+1:2*k+3])][0] += 1
act_dic[tuple(act_per[2*k+1:2*k+3])][1] = j
else:
act_dic[tuple(act_per[2*k+1:2*k+3])][0] = 1
act_dic[tuple(act_per[2*k+1:2*k+3])][1] = j
max_ = max(max_, act_dic[tuple(act_per[2*k+1:2*k+3])][0])
print(max_)
第三题:机器人跳建筑
思路:反推
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] H = new int[N];
for(int i = 0; i < N; i++) {
H[i] = in.nextInt();
}
int E = 0;
for(int i = N-1; i >= 0; i--) {
if(E < 0) E = 0;
else {
double EE = (E+H[i]) / 2.0;
E = (int) Math.ceil(EE);
}
}
System.out.println(E);
}
}
第四题:城市旅行
思路:就是找最小的环,暴力解超时,只通过一半。想换dp来不及了。
就用DP来做好了。参考别人(牛客网用户codeplay)的解法:
动态规划法,简单分析下思路,照这个思路过所有用例问题应该不大:
- 1.因为最后走的路线为一个环,可以设城市0为起点城市。
- 2.将每个城市看作二进制的一个位(1代表有,0代表没有),则数k可以表示一些城市的集合(例如k=13,二进制表示为1101,表示城市0,2,3的集合)
- 3.dp[k][j]表示经过了k集合中的所有城市并且以j城市为终点的路径的最小值。
- 则dp[k][j] = Min{dp[k][j],dp[k-j][i]+dis[i][j] | (0<=i<=n-1 && i属于集合k)};(其中k-j表示集合k中去掉数j后的集合(所以j应该是集合k中的元素)),
- 更多思路可以看这篇文章 https://www.jianshu.com/p/43aa80069265
作者:codeplay
链接:https://www.nowcoder.com/discuss/178303?type=0&order=0&pos=41&page=1
来源:牛客网
第五题:划船
至今没想好该怎么做,希望会做的老哥能指点一二。
有空再把兄弟厂,猪场的笔试题写一写。求个offer!