2024年华为OD机试真题-数的分解 C/C++解法

使用双层for循环进行遍历,获得所有可能的分解长度

#include <iostream>
#include <list>

using namespace std;

// 数的分解
static void HuaWei_OD_test16(void)
{
    int num;
    cin >> num;

    list<int> divide_len_list;
    bool divide_len_has_2 = false; // 是否有两个相邻元素相加等于num

    for (int i = 1; i < num; i++)
    {
        // 对于21来说,11+12就大于21,后续的就不进行遍历了
        if (2 * i + 1 > num && divide_len_has_2)
        {
            break;
        }

        int sum = 0;
        for (int j = i; j < num; j++)
        {
            if (sum < num)
            {
                sum += j;
            }
            else if (sum > num)
            {
                break;
            }
            else
            {
                // sum == num, 记录一次
                if (j - i == 2)
                {
                    divide_len_has_2 = true;
                }
                divide_len_list.push_back(j - i);
                break;
            }
        }
    }

    divide_len_list.sort();

    cout << divide_len_list.front() << endl;
}

int main()
{
    HuaWei_OD_test16();
    return 0;
}

### 关于华为 OD 真题的相关说明 华为 OD(Outsourcing Delivery)模式下的题目通常涉及算法设计、据结构应用以及实际业务场景模拟等问题。以下是针对 **2025 华为 OD 真题** 的相关内容整理: #### 题目概述 根据已知资料,华为 OD 的题目覆盖范围广泛,包括但不限于字符串处理、组操作、动态规划、贪心算法等内容[^3]。这些题目旨在考察候选人的逻辑思维能力、编程技巧以及解决实际问题的能力。 --- #### 示例题目解析 ##### 题目一:分糖果问题 该问题是经典的分配类问题之一,在多个版本中均有体现。具体描述如下: > 给定 `n` 名儿童和 `m` 块糖果,每名儿童至少应获得一块糖果,且满足某些特定条件的情况下完成分配。 解决方案可以采用贪心策略实现时间复杂度优化。以下是一个基于 Java 的实现方式[^2]: ```java import java.util.Arrays; public class CandyDistribution { public static int distributeCandy(int[] ratings) { int n = ratings.length; if (n == 0) return 0; int[] candies = new int[n]; Arrays.fill(candies, 1); // 左到右遍历 for (int i = 1; i < n; ++i) { if (ratings[i] > ratings[i - 1]) { candies[i] = candies[i - 1] + 1; } } // 右到左遍历 for (int i = n - 2; i >= 0; --i) { if (ratings[i] > ratings[i + 1]) { candies[i] = Math.max(candies[i], candies[i + 1] + 1); } } int totalCandies = 0; for (int candy : candies) { totalCandies += candy; } return totalCandies; } } ``` 此代码实现了 O(n) 时间复杂度的最优解法--- ##### 题目二:字符串匹配问题 此类问题常见于 A 卷至 E 卷中的基础部分。例如给定两个字符串 `str1` 和 `str2`,判断是否存在子串关系并返回首次出现的位置。 Python 实现示例如下[^1]: ```python def find_substring(str1, str2): """ 判断 str2 是否为 str1 的子串,并返回其起始位置。 如果不存在,则返回 -1。 """ try: index = str1.index(str2) return index except ValueError: return -1 # 测用例 print(find_substring("hello world", "world")) # 输出: 6 print(find_substring("abcde", "f")) # 输出: -1 ``` 上述方法利用内置函 `.index()` 提供高效查找功能。 --- ##### 题目三:矩阵路径求和 这是 B 卷中的一道典型动态规划问题。目标是从二维网格的左上角移动到右下角,每次仅允许向下或向右走一步,计算最大路径和。 下面是 C++ 的一种实现方案: ```cpp #include <vector> using namespace std; int maxPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> dp(m, vector<int>(n)); dp[0][0] = grid[0][0]; // 初始化第一列 for (int i = 1; i < m; ++i) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } // 初始化第一行 for (int j = 1; j < n; ++j) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } // 动态规划填表 for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; } } return dp[m - 1][n - 1]; } // 测用例 /* 输入: grid = [ [1, 3, 1], [1, 5, 1], [4, 2, 1] ] 输出: 7 (路径为 1→3→1→1) */ ``` 以上代码展示了如何通过动态规划降低时间复杂度至 O(m*n)[^3]。 --- ### 总结 通过对历真题的研究发现,华为 OD 题注重基础知识的应用与扩展思考能力。建议考生多加练习经典算法模型及其变体形式,熟悉不同语言特性以便灵活应对考需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值