我有我想要在Java中解决一个问题,我无法弄清楚,我将需要遵循的算法。 这个问题类似于位串问题(许多位串是如何有长x),但增加了一些难度。 我甚至不知道反正解决正常位串问题的算法。
因此,这里是我的实际问题:我有5个变量。 说QWXY Z.每个变量可以取3个值中的一个(像这样的位串可以采取1或0,但是这可能需要说0,1或2)。 我需要生成这个“位串”的所有可能的组合。
所以,一个组合可能是00000另一种可能是10002,另一种可能是22222,等等。我需要打印出这个“位串”的所有组合
我真的难倒关于如何解决这个问题,甚至拿出一个像样的算法。
谢谢您的帮助! 非常感激。
要做到这一点,你可以只算到你的最大值(在您的示例22222),使用3 BigInteger类的基数支持输出和实例化一个任意基数。 BigInteger类,但是,不支持ZEROFILL这就是为什么我说这个我自己。 这里是将得到的溶液:
public static void main( String[] args ) {
System.out.println( new BitStrings().generateBitStrings( new BigInteger( "2222", 3 ) ) );
}
public List<String> generateBitStrings( BigInteger maxValue ) {
final String format = "%0" + maxValue.toString( 3 ).length() + "d";
BigInteger current = BigInteger.ZERO;
final List<String> result = new ArrayList<String>( maxValue.intValue() );
do {
result.add( String.format( format, Long.valueOf( current.toString( 3 ) ) ) );
current = current.add( BigInteger.ONE );
} while(current.compareTo( maxValue ) <= 0);
return result;
}
输出:
[0000, 0001, 0002, 0010, 0011, 0012, 0020, 0021, 0022, 0100, 0101, 0102, 0110, 0111, 0112, 0120, 0121, 0122, 0200, 0201, 0202, 0210, 0211, 0212, 0220, 0221, 0222, 1000, 1001, 1002, 1010, 1011, 1012, 1020, 1021, 1022, 1100, 1101, 1102, 1110, 1111, 1112, 1120, 1121, 1122, 1200, 1201, 1202, 1210, 1211, 1212, 1220, 1221, 1222, 2000, 2001, 2002, 2010, 2011, 2012, 2020, 2021, 2022, 2100, 2101, 2102, 2110, 2111, 2112, 2120, 2121, 2122, 2200, 2201, 2202, 2210, 2211, 2212, 2220, 2221, 2222]
希望这回答了你的问题。
您需要考虑它背后的数学 。 它使事情更容易,当你理解如何枚举这些字符串。 这将产生不仅生成字符串的一个明显的方式,也让你“随机访问”出来的,即你可以也写了get(int num)
将产生方法num
个元素。
数学是非常简单的,它仅涉及模运算( %
)和部门,这是值得的,当你摸不着头脑自己 。
作为一个简单的第一制剂,假设你有n
十进制数字。
- 给定一个数
x
,你怎么弄的n
个数字吗? - 鉴于
n
数字,你怎么数x
?
你已经想通了这出后,试图从抽象的有10
位。 说,实践二进制计数。 然后,在三元,这将是你的3位数字解决方案。
尝试这个:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Generator implements Iterable<String> {
private int len;
public Generator(int len) {
this.len = len;
}
public Iterator<String> iterator() {
return new Itr(len);
}
private class Itr implements Iterator<String> {
private int[] a;
private boolean done;
public Itr(int len) {
a = new int[len];
done = false;
}
@Override
public String next() {
if (done) throw new NoSuchElementException();
String s = getString();
step(a.length - 1);
return s;
}
@Override
public boolean hasNext() { return !done; }
@Override
public void remove() {
throw new UnsupportedOperationException();
}
private void step(int index) {
if (a[index] == 2) {
if (index == 0) {
done = true;
return;
}
a[index] = 0;
step(index - 1);
} else
a[index]++;
}
private String getString() {
StringBuilder s = new StringBuilder();
for (int i : a)
s.append(i);
return s.toString();
}
}
}
然后,你可以这样做:
Generator g = new Generator(2 /* length of resulting strings */);
for (String s : g)
System.out.println(s);
输出:
00
10
20
01
11
21
02
12
22
基本上,直到我们到达所有我们在这里所做的向上计数的基础-3 222...222
(其中数量2
实例化时声明了s, Generator
)。 希望这可以帮助!
这应该是一个相对容易解决的问题。
本质上,你只是计算所述一组琴弦 Σ^ 5,其中Σ= {0,1,2}。
static Iterable<String> strings(final int radix, final int digits) {
return new Iterable<String>() {
public Iterator<String> iterator() {
return new Iterator<String>() {
private final int hi = (int) Math.pow(radix, digits);
private int cursor;
public boolean hasNext() {
return cursor < hi;
}
public String next() {
int v = cursor++;
int n = digits;
final char[] buf = new char[n];
while (n > 0) {
buf[--n] = (char) (v % radix + '0');
v /= radix;
}
return new String(buf);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
...可以使用如下:
for (final String val : strings(3, 5)) {
System.out.println(val);
}
基本上,我们生成在区间[0,3 ^ 5),其中, 图3是我们的基数和5我们所期望的字符串的长度的号码,然后将该号码转换成三元形式。 0变成00000,3 ^ 5变成100000。
文章来源: Java Algoirthm number of Combinations of variables (Similar to Bit String Algoirthm)