看到了一道有意思的面试算法题

题目:输入6个数,前五个数可以使用加减乘除和括号组成一个表达式,表达式的值要等于第6个数,求出所有表达式的组合。(注: 不能使用stl库)。

下面是c++的解题方法:使用回溯算法来生成所有可能的表达式组合,并逐个验证是否满足条件

#include <iostream>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

class Solution {
public:
    void findExpressions(vector<int>& nums, int target) {
        string operators = "+-*/";
        vector<string> result;
        string expr;

        backtrack(nums, target, 1, expr, result, nums[0]);

        // 输出结果
        for (auto& r : result) {
            cout << r << endl;
        }
    }

private:
    void backtrack(vector<int>& nums, int target, int index, string& expr, vector<string>& result, int currentValue) {
        if (index == nums.size()) {
            if (currentValue == target) {
                result.push_back(expr);
            }
            return;
        }

        string originalExpr = expr;
        int originalValue = currentValue;

        for (char op : "+-*/") {
            if (index != 1) { // 添加运算符
                expr += op;
            }
            expr += to_string(nums[index]);

            switch (op) {
                case '+': currentValue = originalValue + nums[index]; break;
                case '-': currentValue = originalValue - nums[index]; break;
                case '*': currentValue = originalValue * nums[index]; break;
                case '/': 
                    if (nums[index] != 0 && originalValue % nums[index] == 0) {
                        currentValue = originalValue / nums[index];
                    } else {
                        expr = originalExpr;
                        continue;
                    }
                    break;
            }

            backtrack(nums, target, index + 1, expr, result, currentValue);
            expr = originalExpr;
            currentValue = originalValue;
        }
    }

    // 辅助函数,将整数转换为字符串
    string to_string(int num) {
        string str;
        bool isNegative = false;
        if (num < 0) {
            isNegative = true;
            num = -num;
        }

        do {
            str.insert(str.begin(), '0' + (num % 10));
            num /= 10;
        } while (num > 0);

        if (isNegative) {
            str.insert(str.begin(), '-');
        }

        return str;
    }
};

int main() {
    vector<int> nums = {1, 2, 3, 4, 5, 15}; // 示例输入
    int target = nums.back();
    nums.pop_back(); // 移除目标值,只保留前五个数

    Solution sol;
    sol.findExpressions(nums, target);

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值