gpt4 book ai didi

java - 来回遍历数组

转载 作者:行者123 更新时间:2023-11-30 20:58:19 25 4
gpt4 key购买 nike

我们有一个一定长度的数组(比如 3)和一些计数序列:0,1,2,3,4,... 到无穷大。从该输入序列中,我们需要生成将来回遍历数组的序列,如下所示:0,1,2,1,0,1,2,1,0,... length=3 依此类推。

我认为这个任务在许多编程书籍中都很常见,但我无法找到标准解决方案,所以我创建了自己的解决方案。还有其他更有效和优雅的解决方案吗,因为我不喜欢我的解决方案???

#define LENGTH 5
int main()
{
char arr[LENGTH] = {'a','b','c','d','e'};
int i;
int base=0;
for(i=0;i<100;i++){
if(i%(LENGTH-1)==0){
if(base==0) base=LENGTH-1;
else base =0;
}
int j = abs(base-i%(LENGTH-1));
printf("%c ",arr[j]);
}
}

Java 代码(为了您的方便):

public static void traverse(){
char arr[] = {'a','b','c','d','e'};
int base=0;
for(int i=0;i<100;i++){
if(i%(arr.length-1)==0){
if(base==0) base=arr.length-1;
else base =0;
}
int j = Math.abs(base-i%(arr.length-1));
System.out.println(arr[j]+" ");
}
}

最佳答案

此解决方案仅从 i 计算 arr 的索引,从而避免需要保留任何状态(例如当前方向)。因此,它有点复杂,但也适用于 i 的非连续值。

char arr[] = { '0', '1', '2', '3', '4' };
const int LENGTH = sizeof arr / sizeof(*arr); // not necessary for char
assert(LENGTH > 1); // doesn't work for fewer than 2 elements

const int CYCLE = LENGTH - 1;
for (int i = 0; i < 100; ++i) {
printf("%c ", arr[ (i / CYCLE) & 1 ? CYCLE - i % CYCLE : i % CYCLE ]);
}
printf("\n");

解释:i/CYCLE 是数组中的周期数,&1 检查该数的最低有效位以确定方向(奇数周期)其中该位为 1 后退,甚至循环 - 从 0 开始 - 前进)。 i % CYCLE 是向前循环,但由于 CYCLE = LENGTH - 1,它不会到达数组的最后一个索引。 CYCLE - i % CYCLE 是向后循环,从 CYCLE - 0 开始,这是前进时未到达的最后一个索引,并以 结束1,从而避免再次前进时重复索引0

换句话说,正向循环和反向循环都省略了一个索引,以避免改变方向时重复,因此CYCLE = LENGTH - 1,这也意味着LENGTH必须至少为 2 以避免被零除。

关于java - 来回遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53063442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com