C++ 面试问题-没什么帮助

C++ 面试问题-没什么帮助,c++,arrays,C++,Arrays,我在谷歌搜索中遇到了thos quesiton。。。。他们看起来很普通,但我找不到一个像样的答案。有什么提示/链接吗 1.删除O(n)中数组中的重复项,无需额外数组 2.编写一个程序,其打印输出是源代码的精确副本。不用说,仅仅回显实际的源文件是不允许的。对于(1),您可能需要比您给定的更多的约束。但是,请查找基数排序 对于第(2)项,请查找quine。对于第二个问题,请用谷歌搜索quine,您将找到许多答案 (1)不可能,除非对数组进行预排序。基本的解决方法是在数组中保留两个指针,一个向前搜索不

我在谷歌搜索中遇到了thos quesiton。。。。他们看起来很普通,但我找不到一个像样的答案。有什么提示/链接吗

1.删除O(n)中数组中的重复项,无需额外数组

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

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


对于第(2)项,请查找quine。

对于第二个问题,请用谷歌搜索quine,您将找到许多答案

(1)不可能,除非对数组进行预排序。基本的解决方法是在数组中保留两个指针,一个向前搜索不相等的元素,另一个在后面。当向前指针遇到不相等的元素时,它会将其复制到尾部指针中,并递增尾部指针


(2) 我手边没有。这听起来像是一个非常糟糕的面试问题。在大多数解释语言中,0字节(空)源文件是有效的输入,不会输出任何内容。。这应该很重要。

最接近的方法是使用哈希表存储看到的元素,并在数组的开头将每个不重复的元素分配给一个适当的值(这将在数组的末尾留下几个不相关的元素)-这需要O(n)个时间,但不是你想在面试时写的那种事情。或者,只要列表已排序,只需检查每个元素是否等于前一个元素

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

编辑:

这是我的第一个C++解决方案的快速perl版本,您必须手动创建哈希:

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

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

    @return;
}

STL通常不是此类面试问题的选项,但这里有一种使用STL的方法,尽管它会引起额外的排序(如所述):

std::unique()
通常使用Terry在其回答中描述的相同技术来实现(有关如何实现它的示例,请参见g++的stl实现中的
bits/stl_algo.h

对于#2,这里有许多不同语言的答案:


< C++ >这里还有一个替代的奎因:

如何.exe文件可以打印出C++源文件而不回传源文件?我讨厌像第一个问题。问这样的问题真的没有意义,让人觉得自己很笨。在我的实践中,他们会问这样的算法问题,只是为了雇你写些东西。我讨厌这类问题,因为他们没有实际目的,除了前一天他们在谷歌上搜索了“面试问题”之外,他们对候选人没有任何表现。他们都是懒散的问题,如果有人向他们了解我作为程序员的真正能力,我会很小心。这些问题,特别是第二个问题,都是废话。如果你在面试中遇到这个问题,向他们询问你申请的职位中出现问题的实际情况。这就像问砖匠是否会玩砖块一样。@Captain Comic:如果不测试GUI程序员对编程其他部分的了解,我不会雇佣他,尤其是算法和时间复杂性。这对GUI程序员来说非常重要,除非你喜欢用20秒来填充列表的应用程序。嘿,你对#2的回答是+1。回答这样一个毫无意义的问题的最佳方法:如果数组没有预排序,那么可以使用堆排序轻松地对其进行就地排序。@Anna问题说“在O(n)时间内”。排序数组的速度不能超过O(nlogn);因此,我认为数组必须是预排序的,因为不允许使用外部数组,所以我的评论是行不通的。我很确定可以在适当的位置实现基数排序。我可能错了,但我现在在脑子里想得很清楚,看不出哪里会遇到麻烦。
#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