Java中如何向数字序列字符串插入运算符生成全组合表达式
实现逻辑说明
- 首先明确:长度为5的nums数组,相邻数字之间一共存在4个独立的符号插入空隙,每个空隙可以从signs数组中任选一个运算符,最终总共有
5^4=625种不重复的表达式组合 - 之前嵌套循环写法失效的核心原因:没有按照空隙数量匹配对应的嵌套层数,或是循环层级和空隙的对应关系错位,导致组合遗漏。但硬写固定层数的嵌套复用性极差,数组长度变动后需要重新调整代码结构
可运行实现方案
1. 朴素嵌套循环写法(对应嵌套思路的正确实现)
固定4层循环分别对应4个插入空隙的运算符选择,拼接后直接输出:
int[] nums = {1, 2, 3, 4, 5}; String[] signs = {"+", "-", "/", "*", "^"}; for (int signIdx1 = 0; signIdx1 < signs.length; signIdx1++) { for (int signIdx2 = 0; signIdx2 < signs.length; signIdx2++) { for (int signIdx3 = 0; signIdx3 < signs.length; signIdx3++) { for (int signIdx4 = 0; signIdx4 < signs.length; signIdx4++) { String expression = nums[0] + " " + signs[signIdx1] + " " + nums[1] + " " + signs[signIdx2] + " " + nums[2] + " " + signs[signIdx3] + " " + nums[3] + " " + signs[signIdx4] + " " + nums[4]; System.out.println(expression); } } } }
这种写法仅适用于nums长度固定为5的场景,灵活性较差。
2. 通用递归实现(适配任意长度的数字数组)
通过递归遍历每一个插入空隙,为每个空隙枚举所有可选运算符,当所有空隙都完成符号选择时输出最终表达式,不需要根据数组长度手动调整嵌套层数:
public class ExpressionGenerator { public static void main(String[] args) { int[] nums = {1, 2, 3, 4, 5}; String[] signs = {"+", "-", "/", "*", "^"}; // 从第一个空隙开始,初始字符串预存第一个数字 buildExpression(nums, signs, 0, String.valueOf(nums[0])); } private static void buildExpression(int[] nums, String[] signs, int currentGap, String prefixExpr) { // 所有空隙的符号都选择完成,输出最终表达式 if (currentGap == nums.length - 1) { System.out.println(prefixExpr); return; } // 为当前空隙遍历所有可选运算符 for (String sign : signs) { String newPrefix = prefixExpr + " " + sign + " " + nums[currentGap + 1]; // 递归处理下一个空隙 buildExpression(nums, signs, currentGap + 1, newPrefix); } } }
两种方案生成的表达式格式完全符合要求,均为带空格分隔的标准形式,不会出现元素顺序错乱的问题。
内容的提问来源于stack exchange,提问作者OctopuSS7
相关产品推荐
相关产品推荐

