为了账号安全,请及时绑定邮箱和手机立即绑定

来回遍历数组

来回遍历数组

繁花不似锦 2021-12-18 09:53:00
我们有一个长度(比如 3)和一些计数序列的数组:0,1,2,3,4,...到无穷大。在该输入序列中,我们需要生成将来回遍历数组的序列,例如:0,1,2,1,0,1,2,1,0,...等等length=3。我认为这项任务在许多编程书籍中都很常见,但我找不到标准解决方案,所以我创建了自己的解决方案。有没有其他更有效和优雅的解决方案,因为我不喜欢我的解决方案???#define LENGTH 5int 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]+" ");        }    }
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

此解决方案arr仅计算from的索引i,从而避免需要保持任何状态(例如当前方向)。因此,它有点复杂,但也适用于 的非连续值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避免被零除。


查看完整回答
反对 回复 2021-12-18
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

也许是这样的:


#define LENGTH 5

int main()

{

    char arr[LENGTH] = { 'a','b','c','d','e' };

    int current = 0;

    int direction = 1;

    for (int i = 0; i < 100; i++) 

    {       

        printf("%c ", arr[current]);

        if (current == 0)

            direction = 1;

        else if (current == LENGTH - 1)

            direction = -1;

        current += direction;

    }

}


查看完整回答
反对 回复 2021-12-18
  • 2 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信