逻辑打印数字系列1,n,2,n-1,3,n-2,...系列应该是1到n(输入给定)

时间:2017-01-15 15:41:23

标签: java algorithm

我正在尝试基本编程,我遇到了这个问题。我有一个返回类型为字符串的函数,它接受整数输入并且必须打印所提到的系列。这就是我的所作所为。

String s=new String("h");
int[] a=new int[n];
int k=1;
for(int i=0;i<n;i+=2)
{
  a[i]=b;//line6
  a[i+1]=n-(b-1);//line7
  b++;
} 
s=Arrays.toString(a);
return s;

当我进入&#34;偶数&#34;没有。像4.我得到了正确的结果[1,4,2,3]。

但是当我进入&#34;奇怪&#34;没有。像5.我得到一个ArrayOutOfBoundException

我知道我在第6行和第7行出错了,但我不知道如何相应地修改它。

我也希望将字符串返回为1 n 2 n-1 3 n-2 ...而不是[1,n,2,n-1,3,n-2,..]

4 个答案:

答案 0 :(得分:1)

那是因为您有一个从i = 0i < n的循环,并且您正在尝试访问a[i + 1]。这在偶数上运行正常,因为每次递增2,最后一次迭代检查a[n - 2]a[n - 1]

然而,ArrayIndexOutOfBoundException出现在奇数上,因为上一次迭代尝试访问a[n - 1]a[n]

修改循环的一种方法是仅增加1,并通过检查循环内a[i]的奇偶校验来设置i的值:

for(int i = 0; i < n; i++, b++) {
    a[i] = (i % 2 == 0)? b: (n - (b - 1));
} 

答案 1 :(得分:1)

考虑下一个方法:

for(int i=0;i<n/2;i++)
{
   a[2*i] = i+1;
   a[2*i+1] = n-i;
} 
if (n&1==1)  //how to check for oddity in Java?
  a[n-1] = (n+1)/2

答案 2 :(得分:0)

循环内部应该看起来像

a[i] = b;
if (i + 1 < n) { // check the bounds before writing at i+1
    a[i + 1] = n - (b - 1);
}
b++;

原因是当奇数(例如5)i在循环的最后一次迭代中变为4时,4小于5,因此代码进入循环,然后你访问a在索引4,这没关系,但是您尝试在4+1访问它,5,但数组没有索引5,因为。

答案 3 :(得分:0)

将问题分解为两个较小的问题:

生成偶数索引的所有值

for(int i = 0; i < a.length; i += 2)
    a[i] = i + 1;

生成奇数的所有值

for(int i = 1; i < a.length; i += 2)
    a[i] = n - i / 2;

由于奇数的整数除法i / 2可以替换(i - 1) / 2

完整代码

int[] a = new int[n];

for(int i = 0; i < a.length; i += 2)
    a[i] = i + 1;

for(int i = 1; i < a.length; i += 2)
    a[i] = n - i / 2;

return Arrays.toString(a);