倒序遍历数组,不使用减号

3
今天在面试中被问到这个问题。我确定这是一个非常简单的技巧,但是我想不出来。如何遍历一个简单的Java数组(例如,为了从右到左聚合所有值的总和),而不使用“减” (-) 符号(因此循环中没有 i-- 或类似的东西)? 编辑: 我很确定它应该是一个不涉及Java特定结构(如Collections)的技巧。不幸的是,我以为我后来会想到它的,所以我没有问答案:/

1
如果您被允许使用 Collections,您可以将 array 转换为 ArrayList,使用 Collection 的 reverse 方法反转该列表并迭代它。 - Jimmy
可能是在Java中反向迭代列表的重复问题。 - Silvio Mayolo
你可以给出一个输入输出的例子吗? - oleg.cherednik
可能是Java中可以反向进行for-each循环吗?的重复问题。 - Procrastinator
我猜如果有一个不使用Java特定工具(如“Collections”)的答案,有人会提到它。我应该接受这个答案吗? - Cauthon
6个回答

9

递归是一种选择:

int[] numbers = {0,1,2,3,4,5,6,7,8,9,10};

public void traverseReversed(int[] a) {
    traverseReversed(a, 0);
}

private void traverseReversed(int[] a, int i) {
    if ( i + 1 < a.length ) {
        // Traverse the rest of the array first.
        traverseReversed(a, i+1);
    }
    System.out.println(a[i]);
}

public void test() throws Exception {
    System.out.println("Hello world!");
    traverseReversed(numbers);
}

还没有考虑递归 :) - Cauthon

3

如果您被允许使用Collections,则可以轻松地将其反转。请参见下面的代码 -

Collections.reverse(Arrays.asList(array))

1
这会在原地将其反转,不仅破坏了原始数组的顺序,而且比简单地迭代反向操作更耗费资源。 - Makoto
是的,你说得对。我刚学Java。因为OP没有提到保留原始顺序,所以我认为这是一个可能的答案。 - Naseef Chowdhury

3

我不知道面试中的问题是否明智,但这个答案会在某种程度上解决问题。

只需使用~一元位求补运算符即可获得您自定义的-1

String[] array = {"aaa","bbb","ccc"};

int minusOne = ~0;// unary bitwise complement, yields -1


for(int i = array.length + minusOne; i >= 0; i = i + minusOne){

    System.out.println(array[i]);
}

2

如果你可以使用像@Naseef提到的库,你也可以使用Common Lang并将数组反转为:

ArrayUtils.reverse(int[] array)

这会在原地将其反转,不仅破坏了原始数组的顺序,而且比简单地迭代反向操作更耗费资源。 - Makoto

2
如果您有足够的堆栈空间,您可以始终使用递归,在“退出时”处理元素。
void walkArray(int a[],int i){
  if(i+1<a.length)walkArray(a,i+1);
  System.out.println(a[i]);
}

编辑,为确保准确性:代码将作为walkArray(a,0)启动。


1
你错过了反转部分。 - Fureeish
1
@Fureeish,如果不是用这段代码,你会如何定义“reverse”(反转)呢?它将以a[2],a[1],a[0]的方式遍历一个由3个元素组成的数组。 - tevemadar
您说得确实没错。我道歉。由于某种原因,我以为您在递归之前使用了print语句。 - Fureeish

1
如果您不想使用递归,可以使用按位运算。其中的诀窍在于按位非运算符。基本上它会取反数值并减去一。因此,~(~i+1) 等同于 -(-i-1+1)-1,简化为 i-1
int i = array.length;
while(i > 0) {
  i = ~(~i + 1);
  System.out.println(array[i]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接