华为 4.17 笔试AK

暑期实习投到现在大大小小笔试做了好多,基本都只过一题多点,昨天刚刚被xhs虐完,今天做华子的笔试,AK了,头一回AK。算是这段时间找实习处处碰壁唯一能稍微舒缓一下情绪的事情了。

希望华子能给机会

第一题 数据量不大,狠狠暴力。我这做法并不优。不过数据量小

// 4.17 1
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        HashMap<String,Integer> m = new HashMap<>();
        scan.nextLine();
        String s = scan.nextLine();
        String str = s;
        String t = rem(str);
        while(!str.equals(t)){
            str = t;
            t = rem(t);
            if(t.equals("0")) {
                str = t;
                break;
            }
        }
        System.out.print(str);

    }
    static String rem(String s){
        String[] cards = s.split(" ");
        int n = cards.length;
        StringBuilder ans = new StringBuilder();
        int i = 0;
        while(i<n){
            String t = cards[i];
            int ti = i;
            int count = 0;
            while(i<n&&t.equals(cards[i])){
                count++;
                i++;
            }
            if(count==3){
                continue;
            }else if(count == 4){
                ans.append(t);
                ans.append(' ');
            }else{
                for (int j = ti; j < i; j++) {
                    ans.append(t);
                    ans.append(' ');
                }
            }
        }
        if(ans.length() == 0)return "0";
        ans.deleteCharAt(ans.length()-1);
        return ans.toString();
    }

}

第二题 建树+bfs写的。因为是字符串,建树挺麻烦的,应该还有更好的方法,例如并查集应该能做。

//4.17 2
import java.util.*;

public class Main {
    static Set<String> fa = new HashSet<>();
    static HashMap<String, Set<String>> lm = new HashMap<>();
    static HashMap<String, int[]> nm = new HashMap<>();
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int M = scan.nextInt();
        int N = scan.nextInt();
        scan.nextLine();
        String[] problems = new String[N];
        for (int i = 0; i < N; i++) {
            problems[i] = scan.nextLine();
        }
        for(String line:problems){
            String[] items = line.split(" ");
            String father = items[1];
            String child = items[0];
            int lev = Integer.parseInt(items[2]);
            int num = Integer.parseInt(items[3]);

            if(father.equals("*")){
                fa.add(child);
                if(!lm.containsKey(child)) lm.put(child,new HashSet<>());
                if(!nm.containsKey(child)) nm.put(child,new int[]{0,0});
            }else {
                if(!lm.containsKey(father))lm.put(father,new HashSet<>());
                if(!nm.containsKey(father)) nm.put(father,new int[]{0,0});
                if(!lm.containsKey(child))lm.put(child,new HashSet<>());
                if(!nm.containsKey(child)) nm.put(child,new int[]{0,0});
                lm.get(father).add(child);
            }
            nm.get(child)[lev]+=num;
        }
        int ans = 0;
        for (String f:fa) {
            int x = dfs(f);
            if(x>M)ans++;
        }
        System.out.println(ans);
    }
    static int dfs(String root){
        Set<String> x = lm.get(root);
        int[] my = nm.get(root);
        int cost = 5*my[0]+2*my[1];
        for(String y:x){
            cost += dfs(y);
        }
        return cost;
    }
}

第三题 dijkstra,求完再加个索引一块排序。 不过奇怪的是,给的数据n = 1e4,矩阵都1e8了,java竟然只跑180ms,不知道时间是怎么算的

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[][] g = new int[n][n];
        int[] cap = new int[n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                g[i][j] = scan.nextInt();
            }
        }
        for (int i = 0; i < n; i++) {
            cap[i] = scan.nextInt();
        }
        int s = scan.nextInt();
        int ms = scan.nextInt();
        int[][] res = dijkstra(g,s);
        Arrays.sort(res,(a,b)->a[0]==b[0]?a[1]-b[1]:a[0]-b[0]);
        StringBuilder ans = new StringBuilder();
        int sum = 0;
        for (int i = 1; i < n; i++) {
            sum+=cap[res[i][1]];
            ans.append(res[i][1]);
            ans.append(' ');
            if(sum>=ms)break;
        }
        ans.deleteCharAt(ans.length()-1);
        System.out.println(ans);

    }

    static int[][] dijkstra(int[][]g,int s){
        int n = g.length;
        int[] dist = new int[n];
        Arrays.fill(dist,Integer.MAX_VALUE);
        dist[s] = 0;
        boolean[] vis = new boolean[n];
        for (int i = 0; i < n; i++) {
            int t  = -1;
            for (int j = 0; j < n; j++) {
                if(!vis[j]&&(t==-1||(dist[t]>dist[j]))){
                    t = j;
                }
            }
            vis[t] = true;
            for (int j = 0; j < n; j++) {
                if(g[t][j]<0) continue;
                if(dist[t]+g[t][j]<dist[j]){
                    dist[j] = dist[t]+g[t][j];
                }
            }
        }

        int[][]res = new int[n][2];
        for (int i = 0; i < n; i++) {
            res[i][0] = dist[i];
            res[i][1] = i;
        }

        return res;

    }

}

全部评论
膜带佬
2
送花
回复
分享
发布于 04-17 21:48 北京
恭喜
点赞
送花
回复
分享
发布于 04-18 19:06 湖南
秋招专场
校招火热招聘中
官网直投
并查集怎么做?如果不是一颗树的根结点就已经是风险云服务了,这种情况下也得加一吧。我感觉得并查集前加个拓扑排序保证并查集merge顺序才行把。
点赞
送花
回复
分享
发布于 04-21 09:31 陕西
山大学弟吗
点赞
送花
回复
分享
发布于 04-22 19:48 广东
第三题我本来拍了个bellman-ford上去想骗点分,结果直接过了,就是数据太弱了。当然一方面它输入是邻接矩阵,所以数据量不可能真的到给出的范围。
点赞
送花
回复
分享
发布于 04-23 13:04 上海
佬。找到实习了吗
点赞
送花
回复
分享
发布于 04-23 16:18 湖北
题目是啥呀 佬
点赞
送花
回复
分享
发布于 04-23 18:44 江苏

相关推荐

#软件开发2024笔面经##华为##暑期实习#base:北京5.20一面,当天下午约了二面,主管面约到了明天反正自己有offer了也是面着玩,进池子里泡着快乐玩耍1.自我介绍2.我看你去年拿到了华为GTS秋招offer,你怎么不去&nbsp;&nbsp;&nbsp;&nbsp;我去年秋招试水一下面试,但明年才毕业,所以接不了offer2.那来聊聊你的项目吧,你里面写了你保证了接口的可扩展性,你知道哪些方式可以保证接口可扩展性呢?&nbsp;&nbsp;&nbsp;&nbsp;开闭原则,只继承不修改类3.那你知道继承和接口的区别吗?什么时候需要用到继承,什么时候用到接口呢?&nbsp;&nbsp;&nbsp;&nbsp;二方包的时候用接口,从属关系用继承?真不太知道这个题怎么答4.你的项目苍穹外卖使用了Mybatis,&nbsp;Mybatis比起直接连接数据库jdbc有什么优点呢?&nbsp;&nbsp;&nbsp;&nbsp;使用了数据库连接池池化技术,避免了数据库频繁的连接,节省了资源5.你知道为什么数据库连接很耗时吗?&nbsp;&nbsp;&nbsp;&nbsp;没怎么答好,查了一下答案,记录一下,因为数据库连接是基于tcp连接,分为三步,第1步:建立TCP连接,通过三次握手实现;第2步:服务器发送给客户端握手信息,客户端响应该握手消息;第3步:客户端发送认证包,用于用户验证,验证成功后,服务器返回OK响应,之后开始执行命令;用户验证成功之后,会进行一些连接变量的设置,比如字符集、是否自动提交事务等,其间会有多次数据的交互。完成了这些步骤后,才会执行真正的数据查询和更新等操作。执行完成后,还要进行四次挥手断开连接,这些过程加在一起非常耗时6.那你知道需要频繁数据库连接的场景怎么办吗,比如需要频繁查询每个年龄段的用户?&nbsp;&nbsp;&nbsp;&nbsp;索引?7.索引是实际查询过程,从连接的角度呢?你知道SQL预编译吗?&nbsp;&nbsp;&nbsp;&nbsp;不太知道8.问你点Java基础吧,你知道Java锁有哪些种类吗?&nbsp;&nbsp;&nbsp;&nbsp;偏向锁?轻量级锁?重量级锁?公平锁?非公平锁?9.锁实现的底层原理是怎样的呢?&nbsp;&nbsp;&nbsp;&nbsp;更改对象头10.你知道锁升级的过程吗&nbsp;&nbsp;&nbsp;&nbsp;不太清楚,查了一下,当多个线程同时申请共享资源锁的访问时,这就产生了竞争,JVM会先尝试使用轻量级锁,会以CAS方式来获取锁,成功则获取到锁,状态为轻量级锁,失败,则锁升级到重量级锁。11.算法:一个最基本的小岛问题,BFS感觉下来没问什么八股,基本逮着苍穹外卖在问,苍穹外卖问了我半个小时,难顶
点赞 评论 收藏
转发
10 50 评论
分享
牛客网
牛客企业服务