2014 年美团网校园招聘研发工程师长沙站笔试题及答案
1、一堆硬币,一个机器人,如果是反的就翻正,如果是正的就抛掷一次,无穷多次后,求
正反的比例
解答:是不是题目不完整啊,我算的是 3:1
2、一个汽车公司的产品,甲厂占 40%,乙厂占 60%,甲的次品率是 1%,乙的次品率是 2%,
现在抽出一件汽车时次品,问是甲生产的可能性
解答:典型的贝叶斯公式,p(甲|废品) = p(甲 && 废品) / p(废品) = (0.4 × 0.01) /
(0.4 × 0.01 + 0.6 × 0.02) = 0.25
3、k 链表翻转。给出一个链表和一个数 k,比如链表 1→2→3→4→5→6,k=2,则翻转后 2
→1→4→3→6→5,若 k=3,翻转后 3→2→1→6→5→4,若 k=4,翻转后 4→3→2→1→5→6,
用程序实现
非递归可运行代码:
#include
#include
#include
typedef
struct
node
{
node *next;
struct
int
data;
}
node;
void createList(node
{
**head,
int
data)
node *pre,
*cur,
*new;
pre
cur
=
=
NULL;
*head;
(cur
pre
cur
!=
=
=
NULL)
{
cur;
cur->next;
while
}
new
=
(node
*)malloc(sizeof(node));
new->data
new->next
=
=
data;
cur;
if
(pre ==
NULL)
*head
=
new;
else
pre->next
=
new;
}
void printLink(node
{
*head)
while
(head->next
printf("%d
head =
!=
",
{
NULL)
head->data);
head->next;
}
int
{
}
node*
{
}
printf("%d\n",
head->data);
linkLen(node
*head)
int
len =
0;
!=
++;
(head
len
head =
while
}
NULL)
{
head->next;
return
len;
reverseK(node
*head,
int
k)
int
i,
len,
time,
now;
len
=
linkLen(head);
if
(len <
k)
{
return
head;
else
{
time =
len /
k;
}
}
node *newhead,
*prev,
*next,
*old,
*tail;
for
(now
=
old
0,
=
for
(i
tail
=
NULL;
now
<
time;
now ++)
{
head;
prev =
NULL;
i
<
k;
i
++) {
head->next;
prev;
=
=
0,
next =
head->next
prev =
head =
head;
next;
}
if
}
(now ==
0)
newhead
{
=
prev;
old->next
=
head;
if
(tail
!=
NULL)
{
tail->next
=
prev;
}
tail =
old;
}
if
(head
!=
NULL)
{
tail->next
=
head;
}
return
newhead;
}
int
{
main(void)
i,
int
n,
node *head,
k,
data;
*newhead;
while
(scanf("%d
%d",
&n, &k)
!=
for
(i
=
0,
head =
NULL;
EOF)
<
i
{
n;
i
++) {
scanf("%d",
createList(&head,
&data);
data);
}
printLink(head);
newhead
=
reverseK(head,
k);
printLink(newhead);
}
return
0;
}
5、利用两个 stack 模拟 queue
剑指 offer 上的原题,九度 oj 有专门的练习,这里贴一下我的 ac 代码:
#include
#include
#include
typedef
struct
stack
{
int
int
top;
seq[100000];
}
stack;
/**
* 入队操作
*
*
*
*/
T
=
O(1)
void pushQueue(stack
{
*s1,
int data)
s1->seq[s1->top
++] =
data;
}
/**
* 出队操作
*
*
*
*/
T
=
O(n)
void popQueue(stack
{
*s1,
stack
*s2)
if
(s2->top >
{
printf("%d\n",
0)
}
else
{
s2->seq[--
s2->top]);
while
(s1->top
>
0)
{
s2->seq[s2->top
++] =
s1->seq[--
s1->top];
}
if
(s2->top >
0)
printf("%d\n",
s2->seq[--
s2->top]);
else
printf("-1\n");
}
}
int
{
main(void)
n;
data,
int
stack
char str[5];
*s1,
*s2;
while
(scanf("%d",
&n) !=
EOF)
{
// 初始化
s1
s2
s1->top
=
=
=
(stack
(stack
*)malloc(sizeof(stack));
*)malloc(sizeof(stack));
s2->top
=
0;
while
(n
--)
{
scanf("%s",
str);
(strcmp(str, "PUSH")
0)
{
// 入队列
scanf("%d",
pushQueue(s1,
==
&data);
data);
else
{
// 出队列
popQueue(s1, s2);
if
}
}
}
free(s1);
free(s2);
}
return
0;
}
6、一个 m*n 的矩阵,从左到右从上到下都是递增的,给一个数 elem,求是否在矩阵中,给
出思路和代码
杨氏矩阵,简单题目:
#include
#include
/**
* 有序矩阵查找
*
*
*
*/
O(n
T
=
+
n)
void findKey(int
{
**matrix,
int
n,
int
m,
int
key)
int
row,
col;
for
(row
=
0,
if
}
}
}
(matrix[row][col]
=
-
m
1;
col
<
{
printf("第%d 行,第%d 列\n",
break;
row
key)
==
n
&&
col
>=
0;)
{
row +
1,
col +
1);
else
if
col
(matrix[row][col]
-=
1;
>
key)
{
else
{
row
+=
1;
}
printf("不存在!\n");
}
int
{
main(void)
int
i,
j,
key,
n,
m,
**matrix;
// 构造矩阵
scanf("%d
matrix
=
for
(i
=
0;
i
matrix[i]
for
(i
=
0;
i
%d",
(int
&n, &m);
**)malloc(sizeof(int
*)
*
n);
<
=
<
i
n;
(int
n;
i
++)
*)malloc(sizeof(int) *
m);
++) {
m;
j
&matrix[i][j]);
++)
for
(j
=
j
0;
<
scanf("%d",
}
// 查询数据
while
(scanf("%d",
&key)
!=
findKey(matrix,
n,
m,
EOF) {
key);
}
return
0;
}