有n个数,使用加减乘除和括号,使得最终的结果等于m,请列出所有的可能性

问题

有n个数,使用加减乘除和括号,使得最终的结果等于m,请列出所有的可能性

Java算法

import java.util.*;

/**
 * there are some number, use + - * / and ( ), to get all the solution which can get the result target number
 */
public class Test015 {
    public static void main(String[] args) {
        print(new Test015().getResult(new int[] {3, 3, 3, 3}, 7));
    }

    public Test015() {
    }

    public Set<String> getResult(int[] nums, int target) {
        Map<Integer, Set<String>> result = func(nums, 0, nums.length - 1);
        return result.getOrDefault(target, null);
    }

    public Map<Integer, Set<String>> func (int[] nums, int start, int end) {
        // end condition
        if (start == end) {
            Map<Integer, Set<String>> result = new HashMap<>();
            result.put(nums[start], new HashSet<>(Arrays.asList(String.valueOf(nums[start]))));
            return result;
        }

        Map<Integer, Set<String>> result = new HashMap<>();
        for (int i = start; i < end; i++) {
            Map<Integer, Set<String>> left = func(nums, start, i);
            Map<Integer, Set<String>> right = func(nums, i + 1, end);
            for (Integer leftKey : left.keySet()) {
                Set<String> leftValues = left.get(leftKey);
                for (Integer rightKey : right.keySet()) {
                    Set<String> rightValues = right.get(rightKey);
                    updateResult(result, leftValues, rightValues, leftKey, rightKey, 1);
                    updateResult(result, leftValues, rightValues, leftKey, rightKey, 2);
                    updateResult(result, leftValues, rightValues, leftKey, rightKey, 3);

                    if (rightKey == 0 || leftKey % rightKey != 0) {
                        continue;
                    }
                    updateResult(result, leftValues, rightValues, leftKey, rightKey, 4);
                }
            }
        }

        return result;
    }

    private void updateResult(Map<Integer, Set<String>> result, Set<String> leftValues, Set<String> rightValues, Integer leftKey, Integer rightKey, int type) {
        int operateResult = getOperateResult(leftKey, rightKey, type);
        Set<String> v = result.getOrDefault(operateResult, new HashSet<>());
        for (String leftValue : leftValues) {
            for (String rightValue : rightValues) {
                v.add("(" + leftValue + getOperatorString(type) + rightValue + ")");
            }
        }
        result.put(operateResult, v);
    }

    private int getOperateResult(int num1, int num2, int type) {
        int result = 0;
        switch (type) {
            case 1:
                result = num1 + num2;
                break;
            case 2:
                result = num1 - num2;
                break;
            case 3:
                result = num1 * num2;
                break;
            case 4:
                result = num1 / num2;
                break;
            default:
                throw new RuntimeException("not support type" + type);
        }
        return result;
    }

    private String getOperatorString(int type) {
        String result = "";
        switch (type) {
            case 1:
                result = "+";
                break;
            case 2:
                result = "-";
                break;
            case 3:
                result = "*";
                break;
            case 4:
                result = "/";
                break;
            default:
                throw new RuntimeException("not support type" + type);
        }
        return result;
    }

    /* default */
    public static <T> void print(T t) {
        System.out.println(t);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值