1.删除O(n)中的数组中的重复项而不使用额外的数组
2.编写一个程序,其打印输出是源的精确副本。不用说,仅允许回显实际的源文件。
答案 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