某大厂20届实习笔试题2019414

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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值