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