【问题标题】:Traverse array in reverse, without minus sign反向遍历数组,不带减号
【发布时间】:2018-03-06 15:13:36
【问题描述】:

今天在面试时被问到这个问题。我敢肯定这是一个非常简单的把戏,但我想不出来。如何从头到尾遍历一个简单的 Java 数组(例如,为了聚合从右到左的所有值的总和),而不使用“减号”(-)符号(所以没有i-- in循环,或类似的东西)?

编辑:我很确定这应该是一个不涉及 Java 特定结构的技巧(如 Collections)。不幸的是,我以为我以后会自己想,所以我没有问答案是什么:/

【问题讨论】:

标签: java


【解决方案1】:

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

Collections.reverse(Arrays.asList(array))

【讨论】:

  • 这样就原地反转了,不仅破坏了原始数组的顺序,而且比简单地逆向迭代要花费更多。
  • 是的,你是对的。我是 Java 新手。我认为这是一个可能的答案,因为在 OP 中没有提到保持原始顺序。
【解决方案2】:

如果你被允许使用@Naseef 提到的库,你也可以使用Common Lang 和反向数组:

ArrayUtils.reverse(int[] array)

【讨论】:

  • 这样就原地反转了,不仅破坏了原来数组的顺序,而且比简单地逆序迭代要花费更多。
【解决方案3】:

如果你有足够的堆栈空间,你总是可以使用递归,并在你的“出路”上处理元素

void walkArray(int a[],int i){
  if(i+1<a.length)walkArray(a,i+1);
  System.out.println(a[i]);
}

编辑,只是为了确保:代码将以walkArray(a,0) 启动

【讨论】:

  • 你错过了 reverse 部分
  • @Fureeish 我想知道如果不是使用此代码将 3 元素数组作为a[2], a[1], a[0] 遍历的方式,您如何定义反向
  • 你确实是对的。我很抱歉。出于某种原因,我认为您在递归之前使用 print 语句
【解决方案4】:

递归是一种选择:

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);
}

【讨论】:

  • 没想到递归:)
【解决方案5】:

不知道面试中的问题是不是有点睿智,不过这个答案总归是有道理的。

只需使用~ 一元按位补码运算符即可获得您的自定义-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]);
}

【讨论】:

    【解决方案6】:

    如果您不想使用递归,可以使用按位算术。诀窍在于按位非运算符。基本上它否定数字并从中减去一个。所以~(~i+1)-(-i-1+1)-1 相同,简化为i-1

    int i = array.length;
    while(i > 0) {
      i = ~(~i + 1);
      System.out.println(array[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多