在Java中,如何在循环上创建循环?
我想在以下元素上做一个循环: [1,2,11,12,21,221111112121122,…,2222222] 比如说 [1,2,3,11,12,13,21,22,23,31,32,3311112113,…333] 我如何用Java制作它?在我的特殊情况下,我使用4位数字(1,2,3,4),最后一个数字的长度可以是1到10 我设法用Python和PHP实现了这一点。在第一种情况下,我使用列表覆盖列表。我从[[1],[2],]开始,然后对列表中的每个元素添加1和2,得到[[1,1],[1,2],[2,1],[2,2],依此类推:在Java中,如何在循环上创建循环?,java,loops,cycle,Java,Loops,Cycle,我想在以下元素上做一个循环: [1,2,11,12,21,221111112121122,…,2222222] 比如说 [1,2,3,11,12,13,21,22,23,31,32,3311112113,…333] 我如何用Java制作它?在我的特殊情况下,我使用4位数字(1,2,3,4),最后一个数字的长度可以是1到10 我设法用Python和PHP实现了这一点。在第一种情况下,我使用列表覆盖列表。我从[[1],[2],]开始,然后对列表中的每个元素添加1和2,得到[[1,1],[1,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
nchips=总和(芯片)
traj=[]]
last=[]]
而len(最后[0])
当我用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();
}
}
($i=-1;$i-1)的{
$n5=基本单位换算($i,10,5);
$n5_str=strval($n5);
$tr=array();
$found=0;
对于($j=0;$j,如果您不关心生成顺序(我的意思是它将首先生成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);
}
publicstaticvoidgen(整数级){
如果(级别>0){
对于(int i=0;i 对于(int i=1;i这看起来非常像用给定基数中的数字进行计数。(示例中的基数2和基数3)您可以使用integer.toString轻松地将整数转换为给定基数的字符串,并将该字符串的字符映射到符号。示例:
Integer.toString(6, 2) -> "011"
整数.toString(6,2)->“011”
将此字符串映射到字符数组,然后将该数组映射到符号。在您的示例中,这将是:“0”->1和“1”->2
这不是最有效的解决方案,但它可以让Integer.toString完成繁重的工作,让您执行简单的数组转换
要以另一种方式进行转换,可以将数组转换为字符串,然后使用Integer.parseInt再次提取int表示形式
如果您需要执行算术运算(我想主要是++和-,对于循环的上一个和下一个元素),请对整数执行算术运算,并根据需要来回转换
免责声明:我已经有一段时间没有用java编写代码了,因此方法和类名可能已关闭
编辑:如果您需要的符号超过32位和64位整数所能容纳的数量,则始终可以使用大整数
对评论的答复:
正如人们所评论的,这种方法在前导零方面存在问题。显而易见的解决方案是在转换为字符串之前,在整数表示中添加一些值N^(N+1),其中N是基数,N是符号数。这将产生将1,1,2转换为1001的效果,而不是001有效地允许零
但这样做的缺点是过于复杂,不可能像最初设想的那样成为简单的解决方案。我认为您的任务是一项组合任务,您应该实现组合算法,以找到给定数字(1,2,3,4)的唯一组合,并将该算法从1迭代到所需的长度
我无法想象在这里可以使用Java的哪些特定功能。它将是一些迭代器
关于算法的讨论,我建议您阅读公共课堂循环{
静态无效提前(StringBuilder sb,int B){
int pos=sb.length();
而(--pos!=-1&&sb.charAt(pos)='0'+B){
b.塞查拉特(位置“1”);
}
如果(位置==-1){
sb.插入(++pos,'0');
}
b.塞查拉特(pos,(char)(sb.charAt(pos)+1));
}
公共静态void main(字符串参数[]){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<20;i++){
(某人,3);
系统输出打印LN(sb);
}
}
}
推进工作如下:
- 从右向左(
--pos
)
- 将所有
B
s滚动到1
s
- 直到你找到小于
B
的东西或者你撞到了墙上(pos==-1
)
- 如果撞到墙,请插入
0
- 在
pos
这不允许将'11'和'011'视为不同的结果,是吗?我认为这是我在PHP中所做的。但它并不像一开始看起来那么优雅。例如[1,2,3,10,11,12,13,…]将转换为[2,3,4,21,22,23,24,…]所以,我从来没有从1开始得到数字!Sfussengerger是对的;这种方法存在问题。它可以工作,但不像yngvedh所说的那么简单。你是对的。它不像我最初所想的那样工作。我将更新我的答案。如果你将循环条件写成N-->0
,那么就不会那么混乱了fN-->0
.N-->0可以被读取为“N归零”。可以说它实际上更容易读取,但它也有点破坏了表达式的真正含义。这一操作的简单程度取决于您需要对这些循环执行什么操作。您只是想将它们全部列举出来吗?
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);
}
}
}