0-9这10个数字组成无重复的三个数字组合

时间:2022-11-05 16:55:17
0-9这10个数字组成无重复的三位数,应该有120个三位数.

这120个三位数,对应百位、十位、个位,就会有120*120*120个组合

三位数 如: 012 013 014 015 016 017 018 019 023 024 025 026……789 
组合   如:012/012/012  012/012/013  012/012/014

请问有什么好的方法快速生成?
并列出来插入数据库!

每个组合可以生成27个不相同的三位数:
如:012/012/013  
有:000 001 003 ..... 223

这些三位数:如何与000-999 这1000个数快速比对统计!

希望大家能帮忙想一些好的解决方法!

谢谢!

25 个解决方案

#1


判断随即选出的三个数和前面是否相同就可以了 插入数据库用insert 其余楼主你会的吧

#2


  没看明白
   LZ是想生成0-9 没有重复的三位数 不知道000 或者001 算不算重复的,或者算不算三位数
   余下的就是一般的排列组合了

#3


mark

#4


没看明白

#5


UP

#6


楼主的意思是?

#7


good 0-9这10个数字组成无重复的三个数字组合顶一个~~~~

#8


我觉得 自增 行的 比较好。。。

#10


有没有好的建议与想法呀!
JAVA算法实现从000到999之间挑选出个十百三位不重复的数字
就是个位,十位,百位,不能有重复。如:123,231,132,213,312,321 算为重复,只能取最小的123 这6个三位数只算为一个不重重复的三位数



组合会有120*120*120种
这组合会生成27个不重复的三位数字
如:012/012/013  
有:000 001 003 ..... 223 

比对的话,有没有好的算法呢?
这些大的组合下的三位数(000 001 003 ..... 223 )如何有效率的去与000-999这1000个三位数比与统计

#11


mark

#12


mark下。。。

#13


楼主最好还是把原题发出来,让大家看看,如果是项目中需要,则把需求发出来,让大家看看。。。

#14


没有明白楼主的意思

#15


贴一个求JAVA算法实现从000到999之间挑选出个十百三位不重复的数字的算法

import java.util.List;

/**
 * <pre>
 * 求m取n的所有组合。
 * m个数分别为0,1,2...m-1.
 * 算法简述:
 * 二个组合,若仅有元素顺序不同,视其为同一个组合。
 * 左位系低位,右位系高位。
 * 按自然的取法取第一个组合(各数位分别是:0,1,2...n-1),以后的所有组合都经上一个组合变化而来:
 * 从右至左,找到有增量空间的位,将其加1,使高于该位的所有位,均比其左邻位大1,从而形成新的组合。
 * 若所有位均无增量空间,说明所有组合均已被遍历。
 * 使用该方法所生成的组合数中:对任意组合int[] c,下标小的数必定小于下标大的数.
 * </pre>
 */
public class Combination {
int n, m;
int[] pre;// previous combination.

public Combination(int n, int m) {
this.n = n;
this.m = m;
}

/**
 * 取下一个组合。可避免一次性返回所有的组合(数量巨大,浪费资源)。 if return null,所有组合均已取完。
 */
public int[] next() {
if (pre == null) {// 取第一个组合,以后的所有组合都经上一个组合变化而来。
pre = new int[n];
for (int i = 0; i < pre.length; i++) {
pre[i] = i;
}
int[] ret = new int[n];
// 将 pre 数组复制到数组 ret 中
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
int ni = n - 1, maxNi = m - 1;
while (pre[ni] + 1 > maxNi) {// 从右至左,找到有增量空间的位。
ni--;
maxNi--;
if (ni < 0)
return null;// 若未找到,说明了所有的组合均已取完。
}
pre[ni]++;
while (++ni < n) {
pre[ni] = pre[ni - 1] + 1;
}
int[] ret = new int[n];
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}

/**
 * @param args
 */
public static void main(String[] args) {
Combination c = new Combination(3, 10);
int[] ret = new int[3];
int count = 0;
while((ret=c.next())!=null) {
for(int i : ret)
System.out.print(i);
System.out.println();
count ++;
}
System.out.println(count);


}
}

#16


#15楼  顶

#17


记下了

#18


路过,学习学习

#19


路过~

#20


什么呀,没看明白你的题目

#21


学习

#22


路过,学习一下

#23


路过

#24


生成谁机数

#25


引用 23 楼 xxpp688 的回复:
路过


不是生成随机数,而是分析数据!
用来分析彩票数据的!*3D!有没有好的解决方法!

#1


判断随即选出的三个数和前面是否相同就可以了 插入数据库用insert 其余楼主你会的吧

#2


  没看明白
   LZ是想生成0-9 没有重复的三位数 不知道000 或者001 算不算重复的,或者算不算三位数
   余下的就是一般的排列组合了

#3


mark

#4


没看明白

#5


UP

#6


楼主的意思是?

#7


good 0-9这10个数字组成无重复的三个数字组合顶一个~~~~

#8


我觉得 自增 行的 比较好。。。

#9


#10


有没有好的建议与想法呀!
JAVA算法实现从000到999之间挑选出个十百三位不重复的数字
就是个位,十位,百位,不能有重复。如:123,231,132,213,312,321 算为重复,只能取最小的123 这6个三位数只算为一个不重重复的三位数



组合会有120*120*120种
这组合会生成27个不重复的三位数字
如:012/012/013  
有:000 001 003 ..... 223 

比对的话,有没有好的算法呢?
这些大的组合下的三位数(000 001 003 ..... 223 )如何有效率的去与000-999这1000个三位数比与统计

#11


mark

#12


mark下。。。

#13


楼主最好还是把原题发出来,让大家看看,如果是项目中需要,则把需求发出来,让大家看看。。。

#14


没有明白楼主的意思

#15


贴一个求JAVA算法实现从000到999之间挑选出个十百三位不重复的数字的算法

import java.util.List;

/**
 * <pre>
 * 求m取n的所有组合。
 * m个数分别为0,1,2...m-1.
 * 算法简述:
 * 二个组合,若仅有元素顺序不同,视其为同一个组合。
 * 左位系低位,右位系高位。
 * 按自然的取法取第一个组合(各数位分别是:0,1,2...n-1),以后的所有组合都经上一个组合变化而来:
 * 从右至左,找到有增量空间的位,将其加1,使高于该位的所有位,均比其左邻位大1,从而形成新的组合。
 * 若所有位均无增量空间,说明所有组合均已被遍历。
 * 使用该方法所生成的组合数中:对任意组合int[] c,下标小的数必定小于下标大的数.
 * </pre>
 */
public class Combination {
int n, m;
int[] pre;// previous combination.

public Combination(int n, int m) {
this.n = n;
this.m = m;
}

/**
 * 取下一个组合。可避免一次性返回所有的组合(数量巨大,浪费资源)。 if return null,所有组合均已取完。
 */
public int[] next() {
if (pre == null) {// 取第一个组合,以后的所有组合都经上一个组合变化而来。
pre = new int[n];
for (int i = 0; i < pre.length; i++) {
pre[i] = i;
}
int[] ret = new int[n];
// 将 pre 数组复制到数组 ret 中
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
int ni = n - 1, maxNi = m - 1;
while (pre[ni] + 1 > maxNi) {// 从右至左,找到有增量空间的位。
ni--;
maxNi--;
if (ni < 0)
return null;// 若未找到,说明了所有的组合均已取完。
}
pre[ni]++;
while (++ni < n) {
pre[ni] = pre[ni - 1] + 1;
}
int[] ret = new int[n];
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}

/**
 * @param args
 */
public static void main(String[] args) {
Combination c = new Combination(3, 10);
int[] ret = new int[3];
int count = 0;
while((ret=c.next())!=null) {
for(int i : ret)
System.out.print(i);
System.out.println();
count ++;
}
System.out.println(count);


}
}

#16


#15楼  顶

#17


记下了

#18


路过,学习学习

#19


路过~

#20


什么呀,没看明白你的题目

#21


学习

#22


路过,学习一下

#23


路过

#24


生成谁机数

#25


引用 23 楼 xxpp688 的回复:
路过


不是生成随机数,而是分析数据!
用来分析彩票数据的!*3D!有没有好的解决方法!