本帖最后由 cat73 于 2016-7-14 17:53 编辑
NumberIteraror.java
- import java.util.Arrays;
- import java.util.Iterator;
- import java.util.NoSuchElementException;
- /**
- * 一个数字的迭代器<br>
- * 可通过 next 返回一个 Integer 数组,每一个元素代表在这一位上的数字,返回值是大端序的<br>
- * 此实现不是多线程安全的<br>
- * 最大可描述不大于 2 ^ 32 进制、不长于 Integer.MAX_VALUE 位的所有数字
- *
- * @author Cat73
- */
- public class NumberIterator implements Iterator<Integer[]> {
- private final int min;
- private final int max;
- private final int length;
- private boolean hasNext = true;
- private final Integer[] number;
- /**
- * 构造一个新的数字迭代器
- *
- * @param min 每个位上的数字最小是多少?
- * @param max 每个位上的数字最大是多少?
- * @param length 这个数字有多长?
- * @throws RuntimeException 如果 min > max
- * @throws IndexOutOfBoundsException 如果长度小于 1
- */
- public NumberIterator(final int min, final int max, final int length) {
- // 输入检查
- if (min > max) {
- throw new RuntimeException("max: " + max + ", min: " + min);
- } else if (length < 1) {
- throw new IndexOutOfBoundsException(Integer.toString(length));
- }
- // 初始化属性
- this.min = min;
- this.max = max;
- this.length = length;
- this.number = new Integer[this.length];
- // 初始化值到最小值
- for (int i = 0; i < this.length; i++) {
- this.number[i] = this.min;
- }
- }
- @Override
- public Integer[] next() {
- // 如果没有下一个元素则抛出异常
- if (!this.hasNext) {
- throw new NoSuchElementException();
- }
- // 将当前数值当做结果
- final Integer[] result = Arrays.copyOf(this.number, this.length);
- // 将数字加 1
- this.number[0] += 1;
- for (int i = 0; i < this.length && this.number[i] > this.max; i++) {
- // 如果无法再进位则视为没有下一个元素
- if (i + 1 >= this.length) {
- this.hasNext = false;
- } else {
- this.number[i] = this.min;
- this.number[i + 1] += 1;
- }
- }
- // 返回当前元素
- return result;
- }
- @Override
- public boolean hasNext() {
- return this.hasNext;
- }
- }
复制代码
Main.java
- import java.util.Iterator;
- public final class Main {
- public static void main(final String args[]) throws Exception {
- // 初始化一个数字迭代器
- final Iterator<Integer[]> it = new NumberIteraror(1, 4, 4);
- // 循环判断每一个数字
- loop: while (it.hasNext()) {
- // 获取下一个数字
- final Integer[] num = it.next();
- // 4 不能做开头
- if (num[0] == 4) {
- continue loop;
- }
- // 1 与 3 不能在一起
- for (int i = 0; i < num.length - 1; i++) {
- if (num[i] == 1 && num[i + 1] == 3 || num[i] == 3 && num[i + 1] == 1) {
- continue loop;
- }
- }
- // 数字不能重复
- for (int i = 0; i < num.length; i++) {
- for (int j = 0; j < num.length; j++) {
- if (i != j && num[i] == num[j]) {
- continue loop;
- }
- }
- }
- // 输出结果
- for (final int n : num) {
- System.out.print(n);
- }
- System.out.println();
- }
- }
- }
复制代码
输出
- 3421
- 3241
- 2341
- 3412
- 1432
- 1423
- 2143
- 1243
- 3214
- 1234
复制代码
|