华为OD机试是一项重要的面试筛选环节,特别是在2024年,我们可以看到问题复杂度逐年上升,考察范围也越来越广泛。在此,我们将对“2024 B+C+D卷”中的一些代表性真题进行汇总,并给出C语言、C++、Java、Python和JavaScript等五种语言的解法示例,帮助同学们更好地备考。
1. 问题概述
在“2024 B+C+D卷”中,我们可以看到的问题多以数据结构与算法为主,特别是在数组、字符串、图等方面的应用。问题一般涉及到常用的算法如深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划等。以下是几个经典的题目示例。
2. 题目示例
题目1:最长公共前缀
给定一组字符串,求它们的最长公共前缀。
解法:
- C语言
#include <stdio.h>
#include <string.h>
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize == 0) return "";
char* prefix = strs[0];
for (int i = 1; i < strsSize; i++) {
while (strncmp(prefix, strs[i], strlen(prefix)) != 0) {
prefix[strlen(prefix) - 1] = '\0';
}
}
return prefix;
}
- Java
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
- Python
def longest_common_prefix(strs):
if not strs:
return ""
prefix = strs[0]
for s in strs[1:]:
while not s.startswith(prefix):
prefix = prefix[:-1]
if not prefix:
return ""
return prefix
- C++
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return "";
string prefix = strs[0];
for (size_t i = 1; i < strs.size(); ++i) {
while (strs[i].find(prefix) != 0) {
prefix = prefix.substr(0, prefix.size() - 1);
if (prefix.empty()) return "";
}
}
return prefix;
}
};
- JavaScript
function longestCommonPrefix(strs) {
if (strs.length === 0) return "";
let prefix = strs[0];
for (let i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) !== 0) {
prefix = prefix.slice(0, -1);
if (prefix === "") return "";
}
}
return prefix;
}
3. 总结
通过以上代码示例,我们可以看到不同编程语言的解法虽然语法不同,但逻辑结构相似。掌握这些基本的算法题和常用解法,对于提升我们的编程能力和面试的信心都是大有裨益的。
准备OD面试的同学,建议大家多做历年真题,了解不同题型的解法,逐步提高自己的编程与算法思维。不仅要关注代码实现,更要理解背后的思路与数据结构的应用。在日常的练习中,不妨考虑在不同的语言中实现同一算法,进一步加深对算法的理解与掌握。希望这些示例能够帮助到正在备战华为OD机试的你们!