理解三位数组合的定义
在Java中计算三位数的组合,首先要明确“组合”的具体含义,通常情况下,三位数指的是从100到999的所有整数,这些数字的百位、十位和个位均由0-9的数字组成,且百位数字不能为0(否则将变成两位数),组合问题可能涉及两种场景:一种是生成所有可能的三位数列表,另一种是从给定的数字集合中选取三个数字组成不同的三位数,本文将围绕这两种常见场景展开,分别介绍实现方法。

生成所有可能的三位数
如果目标是生成100到999之间的所有三位数,核心逻辑是遍历百位、十位和个位数字,确保百位数字从1到9,十位和个位数字从0到9,以下是具体实现步骤:
使用三层循环遍历数字
for (int hundred = 1; hundred <= 9; hundred++) { // 百位数字:1-9
for (int ten = 0; ten <= 9; ten++) { // 十位数字:0-9
for (int unit = 0; unit <= 9; unit++) { // 个位数字:0-9
int number = hundred * 100 + ten * 10 + unit;
System.out.println(number); // 输出或存储三位数
}
}
}
优化与存储
直接输出所有三位数会生成900个结果(9×10×10),实际应用中可能需要存储到数组或集合中,使用ArrayList存储:
import java.util.ArrayList;
import java.util.List;
List<Integer> threeDigitNumbers = new ArrayList<>();
for (int hundred = 1; hundred <= 9; hundred++) {
for (int ten = 0; ten <= 9; ten++) {
for (int unit = 0; unit <= 9; unit++) {
threeDigitNumbers.add(hundred * 100 + ten * 10 + unit);
}
}
}
这种方法直观且高效,时间复杂度为O(1)(因为循环次数固定为900次),适合需要完整列举所有三位数的场景。
从给定数字中选取三位数组合
另一种常见需求是从一组数字中选取三个数字,组成不同的三位数(需考虑数字是否可重复),给定数字{1, 2, 3},可组成123、132、213等6种排列(若不重复)。

数字不重复的组合
假设给定数字集合中无重复元素,需计算排列数,从{1, 2, 3, 4}中选3个数字组成三位数,排列数为P(4,3)=4×3×2=24种,实现时需确保每个数字在组合中不重复使用:
import java.util.Arrays;
import java.util.List;
public class ThreeDigitCombination {
public static void main(String[] args) {
int[] digits = {1, 2, 3, 4}; // 给定数字集合
List<Integer> result = new ArrayList<>();
for (int i = 0; i < digits.length; i++) {
for (int j = 0; j < digits.length; j++) {
if (j == i) continue; // 确保十位与百位不同
for (int k = 0; k < digits.length; k++) {
if (k == i || k == j) continue; // 确保个位与前两位不同
int number = digits[i] * 100 + digits[j] * 10 + digits[k];
result.add(number);
}
}
}
System.out.println("所有组合:" + result);
}
}
数字可重复的组合
若允许数字重复使用(如给定{1, 2},可组成111、112、121等),则无需跳过重复索引,直接三层循环即可:
for (int i = 0; i < digits.length; i++) {
for (int j = 0; j < digits.length; j++) {
for (int k = 0; k < digits.length; k++) {
int number = digits[i] * 100 + digits[j] * 10 + digits[k];
result.add(number);
}
}
}
使用排列库函数(推荐)
Java的Math工具类或第三方库(如Apache Commons)提供了排列组合的计算方法,使用Stream API生成排列:
import java.util.stream.IntStream;
int[] digits = {1, 2, 3, 4};
IntStream.range(0, digits.length)
.parallel()
.forEach(i -> IntStream.range(0, digits.length)
.filter(j -> j != i)
.forEach(j -> IntStream.range(0, digits.length)
.filter(k -> k != i && k != j)
.map(k -> digits[i] * 100 + digits[j] * 10 + digits[k])
.forEach(System.out::println)
)
);
这种方式代码更简洁,且适合处理更复杂的组合逻辑。

处理边界情况与验证
在实现三位数组合时,需注意以下边界情况:
- 输入数字范围:若给定数字包含0,需确保百位不为0(如{0, 1, 2}不能组成012),可在生成组合时添加判断条件:
if (digits[i] == 0) continue; // 跳过百位为0的情况
- 重复数字处理:若输入集合本身有重复数字(如{1, 1, 2}),需使用
Set去重后再计算组合,避免结果重复。 - 性能优化:对于大规模数字集合(如10个以上数字),三层循环的时间复杂度会显著增加(O(n³)),此时可考虑回溯算法或动态规划优化。
Java中计算三位数组合的核心在于明确需求场景:若需生成所有三位数,通过三层循环遍历百位、十位、个位即可;若需从给定数字中选取组合,则需考虑数字是否可重复,并通过循环或排列库函数实现,实际开发中,还需注意边界条件处理和性能优化,确保代码的健壮性和高效性,通过以上方法,可以灵活解决各类三位数组合问题。


















