面试问题 - 帮助不大

时间:2009-12-24 09:21:15

标签: c++ arrays

我在谷歌搜索中遇到了问题....他们看起来很常见,但我找不到合适的答案。任何提示/链接?

1.删除O(n)中的数组中的重复项而不使用额外的数组

2.编写一个程序,其打印输出是源的精确副本。不用说,仅允许回显实际的源文件。

6 个答案:

答案 0 :(得分:10)

除非数组被预先排序,否则

(1)是不可能的。基本的答案是保持两个指向数组的指针,一个向前搜索不相等的元素,一个尾随指针。当前向指针遇到不相等的元素时,它会将其复制到尾随指针并递增尾随指针。

(2)我没有一个方便。这听起来像一个非常可怕的面试问题。在大多数解释语言中,0字节(空)源文件是有效输入,并且不打印任何......应该计数。

答案 1 :(得分:5)

对于(1),您可能需要比您给出的更多约束。但是,请查找基数排序

对于(2),查找 quine

答案 2 :(得分:3)

对于你的第二个问题google for quine,你会找到很多答案!

答案 3 :(得分:0)

最接近一个是使用散列表来存储看到的元素,并将每个非重复的元素分配到数组开头的适当值(这会在结尾留下几个不相关的元素) - 这将需要O(n)时间,但不是你想在求职面试中写的东西。或者,只要对列表进行排序,只需检查每个元素是否等于前一个元素。

对于2,只是手动打印文件的内容是允许的吗? (如果是这样,这个问题就会毫无意义)。

编辑:

这是我对第一个解决方案的快速Perl版本 - 在c ++中你必须手动创建哈希:

# Return an unsorted version of an array without duplicates
sub unsortedDedup {
    my %seen, my @return;

    map {
        $seen{$_} = 1 
        && push @return, $_ 
        unless (defined $seen{$_})
    } @_;

    @return;
}

答案 4 :(得分:0)

在这样的面试问题中,STL通常不是一个选项,但是这是使用STL做#1的一种方法,尽管它确实需要额外的排序(如Terry's answer所述):

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
  int a[] = { 2, 2, 3, 2, 1, 4, 1, 3, 4, 1 };
  int * end = a + sizeof(a) / sizeof(a[0]);

  std::sort(a, end);          // O(n log n)
  end = std::unique(a, end);  // O(n)

  std::copy(a, end, std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
}

结果如下:

$ ./a.out 
1 2 3 4

std::unique()通常使用Terry在其答案中描述的相同技术实现(请参阅g ++的STL实现中的bits/stl_algo.h以获取如何实现它的示例。)

答案 5 :(得分:0)

对于#2,这里有不同语言的答案:http://www.nyx.net/~gthompso/quine.htm

c ++中还有一个替代quine:http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html