java - 来回遍历数组

标签 java c arrays algorithm mod

我们有一个一定长度的数组(比如 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/

相关文章:

c - 如何在C语言的数组结构中使用qsort()

java - 在 Android 中通过 USB 将 ArrayList<integer>() 发送为 byte[] 格式

arrays - 一旦达到客户端选择的数字,Powershell 循环就会为变量分配一个值

java - JMX 中 MBean 的最大数量

c - 骑士每次在不同位置的棋盘上移动 c

java - 在运行时添加@XmlTransient注释(与自己的注释结合)

c - 函数system()是否可以在线程中调用?

arrays - 来自数组类型的 Typescript 接口(interface)

java - 为什么在Codewars编辑器中得到意外的数组 token ?

JavaMail - 如何发送带有图像的 html 内容