彭博专访 |第 2 组(视频会议)
单击此处查看第一次电话采访的文档。
视频会议是在通过电话采访后举行的,它是在 Skype 上与来自彭博社的 2 位采访者:弗雷迪和查德举行的。
电话的开始是他们两人自我介绍,我也是,我再次被要求说出我对彭博社的了解,以及我为什么想在那里工作。
面试官接着跳到第一个问题,很直接,对于下面的代码,回答给定的 9 个问题。
#include
int main(int argc, char *argv[])
{
char abc[27];
char *ptr = abc;
strcpy(abc, "abcdefgxyz");
/*
* What are the types and values of expressions:
*
* 1. abc
* 2. *abc
* 3. abc[2]
* 4. &abc[3] //&abc[3] = abc + 3*sizeof(char)
* 5. abc+4
* 6. *(abc+5) + 20000 //h long long x = int * 1LL * int
* 7. abc[10] //'\0'
* 8. abc[12] //memset ()
* 9. &ptr //char**
*/
return 0;
}
第二个问题如下:
显示的代码用于打印当前日期,但由于某种原因,它没有。
你需要弄清楚原因。
#include
#include
#include
char *get_date()
{
char buf[80];
time_t now = time(0);
strcpy(buf, ctime(&now));
return buf;
}
int main(int argc, char *argv[])
{
char *date = get_date();
printf("date=%s\n", date);
return 0;
}
一开始代码对我来说看起来不错,我认为唯一的问题是在堆栈而不是堆上声明 char 数组 buf。
所以,我建议动态分配应该解决这个问题,我们应该使用 malloc(80*sizeof(char)) 而不是 buf[80]
面试官说这是正确的一步,但他仍然需要一个理由。
面试官给出了一个提示,如果在 printf if 之前设置了断点,调试器会显示 date 确实保存了正确的结果,所以问题出在 printf 上。
在我有足够的时间后,面试官决定给我下一步行动的答案。
问题是当调用 printf 时,它需要堆栈的一部分,这可能会影响堆栈保留的字符数组 buf。
下一个问题如下:
给定一个整数 n,返回它可以表示为 1 和 2 之和的方式数,顺序很重要。
我建议我们使用递归函数来计算它。
然后建议使用某种记忆。
代码如下:
//////////////////
//
// number of ways
// n = 3
// 3 = 1,2
// 1,1,1,
// 2,1
int memo[1000000]; // memset (memo, -1, sizeof(memo));
int ways_of_sum_up(int n)
{
if (n == 0)
return 1;
if (n < 0)
return 0;
if (memo[n] != -1)
return memo[n];
int ans = ways_of_sum_up (n-1) + ways_of_sum_up (n-2);
return memo[n] = ans;
}
然后我意识到这个问题形成了线性递归,其中 f(n) = f(n-1) + f(n-2),所以可以使用矩阵求幂来解决。
我花了大约 15 分钟向面试官解释解决方案,他们似乎一个字都听不懂。
f(0) = 1
f(1) = 1
f(n) = f(n-1) + f(n-2)
[1 1][f(n)] [f(n)+f(n-1)]
[1 0][f(n-1)] [f(n)]
[1 1]^m
[1 0]
x^y = x^(y/2) * x^(y/2) = x^(y/4) * x^(y/4) * x^(y/4) * x^(y/4)
= ...... = x^1 ............ x^1
x^5 = x^2 * x^2 * x
[1 1]^2 [1 1]^1 x*x
[1 0] [1 0]
该解决方案的运行时间复杂度为 O(log(n)),与内存复杂度相同。
还有一个我没来得及说的解决方案,它的时间复杂度为 O(n),内存复杂度为 O(1),将这个问题建模为斐波那契问题。
最后一个问题太简单了,我被要求反转一个字符串,我使用了 2 个指针,这里是代码:
//////////
// "hello world" -> "dlrow olleh"
void reverse_word( char* str, int size )
{
int p1, p2;
p1 = 0;
p2 = size-1;
while (p1 < p2){
char tmp = str[p1];
str[p1] = str[p2];
str[p2] = tmp;
p1++;
p2--;
}
}
最后,我被要求使用此代码来反转句子中的单词,代码如下:
// "hello world" -> "world hello"
// "hello world" -> "dlrow olleh"
// "hello there everyone" -> "everyone there hello"
// "hello" -> ?
void reverse_sentence( char* str, int size )
{
int p1;
p1 = 0;
//"hello world"
reverse_word (str, size); //linear
//"dlrow olleh"
//"world olleh"
//"world hello"
for (int i=0;i
结果:拒绝。
总结:面试官解决问题的能力不是很好,他们只是很好的实现者,所以输入整洁干净的代码,使用明显的想法,不要做复杂的解决方案,因为他们很可能不会得到它。
如果我在这次采访中犯了一个错误,我会说这是使用矩阵求幂而不是更简单的线性时间常数内存解决方案。
祝你好运,通过这个视频会议意味着你要去伦敦进行现场最后面试,所以你还有另一个理由要尽力而为。