【问题标题】:print an array whose length and dimensions are unknown [closed]打印一个长度和维度未知的数组[关闭]
【发布时间】:2013-07-12 03:18:59
【问题描述】:

在一次采访中,我被要求打印一个长度和维度未知的数组的所有元素。我找不到办法,但面试官说可以。谁能告诉它怎么做?

【问题讨论】:

  • A) 选择一种语言;它们并不完全相同。 B) 展示您尝试过/想到的内容。
  • 请告诉你的面试官他提出了不好的问题
  • 告诉我,你学过 C++ 和 Java 吗?

标签: java c++ arrays loops multidimensional-array


【解决方案1】:

在 Java 中,数组的大小总是已知的。如果没有 length,则无法创建数组,因此这个问题在 Java 中没有意义。

在 C++ 中,您要么知道长度,要么不知道。你不能处于不知道长度的位置,但你可以计算出来,因为那样你就会知道长度。他们可能的意思是有一个像 0 这样的标记值,而不是作为长度存储,但是一旦你找到这样的标记值,你就知道长度了。

【讨论】:

    【解决方案2】:

    这个问题真的只有在 C++ 中才有意义,所以这就是我要解决的问题。假设你真的有一个数组(不仅仅是一个指向数组开头的指针)你可以做到。诀窍是将数组(通过引用)传递给可以从其类型推断其大小的函数模板:

    #include <iostream>
    
    template <class T, size_t N>
    void print(T (&array)[N]) { 
        for (size_t i=0; i<N; i++)
            std::cout << array[i] << "\n";
    }
    
    int main() {
        int array1[] = {1, 2, 3, 4, 5};
        char array2[] = {'a', 'b', 'c', 'd'};
    
        print(array1);
        std::cout << "\n";
        print(array2);
    }
    

    【讨论】:

      【解决方案3】:

      在 C++ 中,可以认为自动或静态存储数组的长度是已知的,您可以使用sizeof 运算符或模板来获取它。另一方面,您无法确定动态分配的数组的长度,也无法确定数组的长度,因为您只有一个指向该数组的指针。这也适用于自动或静态存储数组在它们衰减为指针的上下文中。

      为了说明第一点,下面是一个打印自动存储数组元素的函数示例:

      template< class T, size_t N >
      void print_array(const T (&array)[N] )
      {
        for (size_t i = 0; i < N; ++i)
          std::cout << i <<" ";
        std::cout << std::endl;
      }
      

      还有一个用法示例:

      int [] data = {1, 2, 3, 4, 5, 6};
      print_array(data);
      

      现在,要回答 C++ 中的问题,没有符合标准的方法不会调用未定义的行为来打印您不知道或无法通过与打印相同的机制找到其大小的数组元素它。打印元素要求您了解或了解数组的长度。

      【讨论】:

        【解决方案4】:

        我假设您没有关于数组类型的任何信息,例如当您只有 Object 引用它时。那样的话……

        在Java 中有java.lang.reflect.Array 类可用于帮助您处理数组,例如获取其元素、长度等。您也可以使用java.lang.Class 类来获取有关任何对象类的类型的信息,例如isArray(),如果它是数组getComponentType(),则可以查看数组元素的类(对于String[],它将返回String)。

        这里有一些代码示例,可用于打印一维或多维数组中的元素

        public static void printElements(Object someArray) {
            if (someArray == null) {
                System.out.print(someArray);
                return;
            }
        
            Class<?> clazz = someArray.getClass();
            if (clazz.isArray()) {// we need to iterate over its elements
                int length = Array.getLength(someArray);
                System.out.print("[");
                for (int i = 0; i < length; i++) {
                    // lets test if array is multidimensional
                    if (clazz.getComponentType().isArray()) {// if element is also
                                                                // arrays
                        // we can process them with our method
                        printElements(Array.get(someArray, i));
                    } else {// here element is not an array
                        // so we can print it
                        System.out.print(Array.get(someArray, i));
                        if (i < length - 1)
                            System.out.print(", ");
                    }
                }
                System.out.print("]");
            } else {
                System.out.println(someArray+" is not an array!");
            }
        }
        

        用法:

        int[][][] arr = { { { 1, 2, 3 }, null, { 4, 5 } }, {} };
        printElements(arr);
        

        输出:

        [[[1, 2, 3]null[4, 5]][]]
        

        【讨论】:

          【解决方案5】:

          如果您想在 java 中的数组上使用迭代器,您可以使用其中一种直接实现。例如:

          Apache Commons Collections ArrayIterator

          或者,这个,如果你想使用泛型:

          com.Ostermiller.util.ArrayIterator

          请注意,如果您想在原始类型上使用迭代器,则不能,因为原始类型不能是泛型参数。例如,如果你想要一个迭代器,你必须使用一个迭代器,如果它由一个 int[] 支持,这将导致大量的自动装箱和 -unboxing。

          【讨论】:

            猜你喜欢
            • 2015-07-22
            • 2020-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-15
            相关资源
            最近更新 更多