如何在Java生成指定长度数字组合时排除带有前导零的结果
解决方案
你可以从两种实现思路中选择适配自己需求的方案:
方案1:最小改动后置校验
仅修改递归终止的判断逻辑即可,不需要调整原有递归生成逻辑,对现有代码侵入性最低:
static void printAllPossibilities_(String charSet, int length, String temp) { if (length == 0) { // 新增前导零判断,只要首位字符为0就直接跳过输出和计数 if (temp.charAt(0) == '0') { return; } System.out.println(temp); counter += 1; return; } for (int i = 0; i < charSet.length(); i++) printAllPossibilities_(charSet, length - 1, temp + charSet.charAt(i)); }
该方案适配性强,哪怕字符集是动态传入的也可以正常生效,不需要提前预知字符集的取值范围。
方案2:前置规避高性能方案
如果生成的字符串长度较长,方案1会先生成大量前导零的无效字符串再丢弃,会造成不必要的性能损耗。你可以拆分递归逻辑,在生成首位时就直接排除0,后续位再正常遍历整个字符集即可,修改后完整代码如下:
public class Combinations { static int counter = 0; public static void main(String[] args) { printAllPossibilities("012345", 3); System.out.println("Combinations: " + counter); } static void printAllPossibilities(String charSet, int length) { // 首位单独处理,过滤掉0 for (int i = 0; i < charSet.length(); i++) { char firstChar = charSet.charAt(i); if (firstChar != '0') { printAllPossibilities_(charSet, length - 1, String.valueOf(firstChar)); } } } static void printAllPossibilities_(String charSet, int length, String temp) { if (length == 0) { System.out.println(temp); counter += 1; return; } for (int i = 0; i < charSet.length(); i++) printAllPossibilities_(charSet, length - 1, temp + charSet.charAt(i)); } }
两种方案用你提供的测试用例"012345"生成长度为3的组合,最终计数都是180,符合预期计算规则:非0首位共5种选择,后两位各6种选择,总数量为5*6*6=180。
内容的提问来源于stack exchange,提问作者learningjava
相关产品推荐
相关产品推荐

