分享一波华为od机试题目吧,刚做的热乎的。

1、给你两个字符串 t 和 p ,t.length() >= p.length(),让你找到 t 中是否包含p,如果包含找到p在t中的第一个位置,否则输出No
一般三种做法    1)调库,2)KMP 3)字符串HASH我怕麻烦就调库的,数据量很大,暴力肯定过不了 t的长度100W,p的长度最大1W
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String t = bf.readLine();
        String q = bf.readLine();
        if (t.contains(q)) {
            System.out.println(t.indexOf(q) + 1);
        } else {
            System.out.println("No");
        }
    }

}



2、给你一个数字让你把他拆分成两个素数的乘积   
例如 15    
输出:
3 5
我暴力的但超时了,也想过搞个set存储所有的素数,但是通过的样例更少,最后暴力通过95%
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();
        int num = Integer.parseInt(str);
        boolean flag = true;
        for (int i = 2; i < num; i++) {
            if (num % i == 0 && isValid(i) && isValid(num / i)) {
                System.out.println(i + " " + num / i);
                flag = false;
                break;
            }
        }
        if (flag) System.out.println("-1 -1");
    }

    public static boolean isValid(int num) {
        for (int i = 2; i * i < num; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

3、给你几个服务器(忘了叫啥了),几个之间可以内部通信,给你多行字符串(样例见下),dp[i][j]的值如果为1,表示可以直接通信,为0则不通信,问你需要连接几个服务器,能使得所有服务器可以直接通信。
思路呢,就是并查集,模板题,啥也没变,返回不连通的一共有几堆即可。    AC了,代码仅供参考
1 0 0
0 1 0
0 0 1
输出 3

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str;
        List<String> list = new ArrayList<>();
        while ((str = bf.readLine()) != null) {
            list.add(str);
        }
        //转化为邻接矩阵
        int N = list.size();
        int[][] adj = new int[N][N];
        for (int i = 0; i < adj.length; i++) {
            String[] split = list.get(i).split(" ");
            for (int j = 0; j < split.length; j++) {
                adj[i][j] = Integer.parseInt(split[j]);
            }
        }
        UnionFind uf = new UnionFind(N);
        for (int i = 0; i < N; i++) {
            //连接一次即可,没必要重复连接    因此 j > i
            for (int j = i + 1; j < N; j++) {
                //值为1,则连接一下
                if (adj[i][j] == 1) {
                    uf.union(i, j);
                }
            }
        }
        System.out.println(uf.count);
    }

    public static class UnionFind {
        int[] parent;
        int count;

        public UnionFind(int n) {
            count = n;
            parent = new int[n];
            //初始化每个的父类为自己
            for (int i = 0; i < n; i++) {
                parent[i] = i;
            }
        }

        //找到自己的父类
        public int find(int x) {
            //隔代找,跟快一点,常见的两种优化方式之一
            while (x != parent[x]) {
                parent[x] = parent[parent[x]];
                x = parent[x];
            }
            return x;
        }

        public void union(int x, int y) {
            int rootX = find(x);
            int rootY = find(y);
            if (rootX == rootY) return;
            //不连通就连接一下
            parent[rootX] = rootY;
            count--;
        }
        
        public int count() {
            return count;
        }
    }
}


#华为OD##笔经#
全部评论
并查集这个希望大家多练练,百度上有很好的教学材料:https://zhuanlan.zhihu.com/p/93647900/
4 回复 分享
发布于 2022-04-16 15:54
第三题dfs图就行了吧,,数量-1,
1 回复 分享
发布于 2022-06-13 20:38
谢谢楼主分享😀,礼貌借楼:【华为OD招聘】: 岗位:研发 / 测试 / 算法 / 大数据语言:java/web/python/c/c++/JS/go 地域:东莞、深圳、西安、武汉、成都、上海等。岗位多多,可私聊我~ 【说明】: 1、面试、绩效评定、均由华为管理层进行,满一年即有名额转正华为,转华为的要求透明,量化,达到要求即可, 2、接触并开发核心业务代码(非边缘代码!),技术栈全面,技术牛人多,技术氛围好,和互联网技术栈看齐 3、基本工资+绩效工资+年终奖+华为办公环境+带薪年假,与华为员工同工同酬,pl 无区别分配任务 想尝试OD或者想咨询相关问题的都欢迎来戳我!🤠
1 回复 分享
发布于 2022-04-27 17:14
第二题是质数吗?
点赞 回复 分享
发布于 2022-06-12 09:15
用了indexOf就不需要用contains了。。。
点赞 回复 分享
发布于 2022-06-09 20:27
感谢,先收藏一波
点赞 回复 分享
发布于 2022-05-12 15:55
第二题 for (int i = 2; i < num; i++)  这里 i 范围从 num 改成 【num/2+1】能减少一半的计算量,应该能 AC
点赞 回复 分享
发布于 2022-05-12 15:47
😂他们都说考中等题,看了你的题目,前俩肯定会写
点赞 回复 分享
发布于 2022-05-11 16:32
第一题这样写也可以AC吗?🤣
点赞 回复 分享
发布于 2022-04-23 15:38

相关推荐

评论
30
156
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务