分享一波华为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; } } }