我想对以下要素进行循环:
[1,2,11,12,21,22,111,112,121,122,...,222222]
或者例如
[1,2,3,11,12,13,21,22,23,31,32,33,111,112,113,... 333333333]
如何在Java中创建它?在我的特定情况下,我使用4位数字(1,2,3,4),最后一位数字的长度可以是1到10。
我设法用Python和PHP做到了。在第一种情况下,我使用列表列表。我从[[1],[2],]开始,然后对于列表中的每个元素,我添加了1和2,所以我得到了[[1,1],[1,2],[2,1],[2] ,2]]等等:
nchips = sum(chips)
traj = [[]]
last = [[]]
while len(last[0]) < nchips:
newlast = []
for tr in last:
for d in [1,2,3,4]:
newlast.append(tr + [d])
last = newlast
traj += last
当我在PHP中使用它时,我使用了基数为3的数字。但这是一个棘手且不优雅的解决方案。
for ($i=-1; $i<=$n; $i+=1) {
if ($i>-1) {
$n5 = base_convert($i,10,5);
$n5_str = strval($n5);
$tr = array();
$found = 0;
for ($j=0; $j<strlen($n5_str); $j+=1) {
$k = $n5_str[$j];
if ($k==0) {
$found = 1;
break;
}
array_push($tr,$k);
}
if ($found==1)
continue;
} else {
$tr = array();
}
}
可以在Java中轻松完成吗?
答案 0 :(得分:5)
这看起来非常像在给定基数中使用数字计算。 (示例的基数为2和3)您可以使用Integer.toString轻松地将整数转换为给定基数的字符串,并将该字符串的字符映射到符号。例如:
Integer.toString(6, 2) -> "011"
将此字符串映射到字符数组,然后将该数组映射到符号。在您的情况下,将是:'0' - &gt; 1和'1' - &gt; 2。
这不是最有效的解决方案,但它允许Integer.toString执行脏工作,让您进行简单的数组转换。
要转换另一种方法,可以从数组转换为字符串,然后使用Integer.parseInt再次提取int表示。
如果你需要执行算术(我猜主要是++和 - 对于循环的前一个和下一个元素),在整数上进行它们并根据需要来回转换。
免责声明:我没有在java中编码一段时间,因此方法和类名可能会关闭。
编辑:如果需要的符号数多于32位和64位整数,则可以使用big int。
正如人们所评论的那样,这种方法存在前导零问题。显而易见的解决方案是在转换为字符串之前向整数表示添加一些值N ^(n + 1),其中N是基数,n是符号数。这将有效地将1,1,2转换为1001而不是001,从而有效地允许零。
但是这样做的缺点是成为一个过于复杂的解决方案,实际上就像它最初想要的简单解决方案一样。
答案 1 :(得分:2)
public class Cycle {
static void advance(StringBuilder sb, int B) {
int pos = sb.length();
while (--pos != -1 && sb.charAt(pos) == '0' + B) {
sb.setCharAt(pos, '1');
}
if (pos == -1) {
sb.insert(++pos, '0');
}
sb.setCharAt(pos, (char) (sb.charAt(pos) + 1));
}
public static void main(String args[]) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {
advance(sb, 3);
System.out.println(sb);
}
}
}
推进工作如下:
--pos
)B
翻转到1
s B
的内容或者你发现了pos == -1
)0
pos
答案 2 :(得分:1)
如果你不关心生成顺序(我的意思是它首先生成1; 11; 111,在生成1; 2; 3之前)使用这个:
public static void gen(int level) {
if (level > 0) {
for (int i = 0; i < level; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
if (level == 10)
return;
for (int i = 1; i <= 4; i++) {
arr[level] = i;
gen(level + 1);
}
}
public static void main(String[] args) {
gen(0);
}
但如果你关心订单,请使用:
private static int top;
private static int[] arr = new int[10];
public static void gen(int level) {
if (level == top) {
for (int i = 0; i < level; i++)
System.out.print(arr[i] + " ");
System.out.println();
return;
}
for (int i = 1; i <= 4; i++) {
arr[level] = i;
gen(level + 1);
}
}
public static void main(String[] args) {
for (top = 1; top <= 10; top++)
gen(0);
}
答案 3 :(得分:1)
我相信你的任务是一个组合任务,你应该实现组合算法来找到给定数字(1,2,3,4)的唯一组合 - 并将这个算法从1迭代到所需的长度。
我无法想象你可以在这里使用Java的哪些特定功能。它将是一些迭代器。
关于算法的讨论,我建议你阅读Algorithm to return all combinations of k elements from n