Redian新闻
>
又面了一上午,M家的,大家进来做题
avatar
又面了一上午,M家的,大家进来做题# JobHunting - 待字闺中
b*m
1
只说一道吧(因为其它的有些简单,就不浪费大家时间了):设计一个模块,包括类成
员和接口,不断receive一些package(从一个stream过来),每个package带一个
priority number,从1到100,1最低,100最高。有user从该模块不定时取package,要
求从priority number最高的package中取最先进来的一个发出去。要考虑时间和空间的
效率。
avatar
t*2
2
整100个queue?最直接了

【在 b***m 的大作中提到】
: 只说一道吧(因为其它的有些简单,就不浪费大家时间了):设计一个模块,包括类成
: 员和接口,不断receive一些package(从一个stream过来),每个package带一个
: priority number,从1到100,1最低,100最高。有user从该模块不定时取package,要
: 求从priority number最高的package中取最先进来的一个发出去。要考虑时间和空间的
: 效率。

avatar
b*e
3
用100个list?
O(1)时间, O(n)空间:
list prio_lists[100];

【在 b***m 的大作中提到】
: 只说一道吧(因为其它的有些简单,就不浪费大家时间了):设计一个模块,包括类成
: 员和接口,不断receive一些package(从一个stream过来),每个package带一个
: priority number,从1到100,1最低,100最高。有user从该模块不定时取package,要
: 求从priority number最高的package中取最先进来的一个发出去。要考虑时间和空间的
: 效率。

avatar
x*s
4
priority queue=>max heap
avatar
h*6
5
一个max heap应该可以了,比较时priority优先:(priority number, timestamp)
avatar
h*6
6
找第一个不为空的list时间不是O(1)吧?

【在 b****e 的大作中提到】
: 用100个list?
: O(1)时间, O(n)空间:
: list prio_lists[100];

avatar
b*e
7
总共100个list, 常数值是大了点,不过也算O(1).

【在 h********6 的大作中提到】
: 找第一个不为空的list时间不是O(1)吧?
avatar
h*n
8
agree

【在 h********6 的大作中提到】
: 一个max heap应该可以了,比较时priority优先:(priority number, timestamp)
avatar
r*i
9
Java:
class StreamPackage implements Comparable
{
int priority;
date receivedTime;
byte[] content;
public int compareTo()
{
//first sort by priority descending order, then received time
}
}
class PackageHandler
{
private PriorityBlockingQueue packages;

public PackageHandler()
{
packages=new PriorityBlockingQueue();
}
public void receivePackage(StreamPackage sp)
{
}
public void sendPackage()
{
StreamPackage sp= packages.poll();
if(null!=sp)
//send
}
}
avatar
d*i
10
拿到OFFER了吗
avatar
h*n
11
凑热闹写一个C++版本的
struct mycomparison
{
bool operator()(const Package * & p1, const Package * & p2) const
{
if(p1->getOrder() > p2->getOrder())
return true;
else if(p1->getOrder() < p2->getOrder())
return false;
else
{
return p1->getTimeStamp() < p2->getTimeStamp();
}
}
};
class PackageHandler
{
private:
priority_queue, mycomparison> pq;
Package* pac;
public:
void ReceivePac()
{
while(1)
{
pac = ReceivePacFromStream();
if(pac)
pq.push(pac);
}
}

Package* UserGetPackage()
{
if(!pq.empty())
{
pac = pq.top();
pq.pop();
return pac;
}
return NULL;
}
}
class Package
{
private:
int order;
double timestamp;
public:
Package(int o, double t)
{
order = o;
timestamp = t;
}
int getOrder()
{
return order;
}
double getTimeStamp()
{
return timeStamp;
}
}
avatar
b*m
12
有人问起来其它的题,就说一道稍微不简单的吧(对于大牛们还是很简单):Node这样
的structure,有next和down两个指针,给定一个head指针(就是说没有其它next和
down指向它),要求把这个类似二叉树的二维结构的数据组展平(flatten),最后成
为只有next指向的类似singly linked list的结构。
avatar
h*n
13
这道题基本上和programming interview expose里面的题差不多
只不过里面的是要求flatten双向链表
我感觉双向链表更好做,占个位置,稍后上代码

【在 b***m 的大作中提到】
: 有人问起来其它的题,就说一道稍微不简单的吧(对于大牛们还是很简单):Node这样
: 的structure,有next和down两个指针,给定一个head指针(就是说没有其它next和
: down指向它),要求把这个类似二叉树的二维结构的数据组展平(flatten),最后成
: 为只有next指向的类似singly linked list的结构。

avatar
b*m
14

双向链表、二叉树,意思都差不多。要求O(n)时间和O(1)空间。

【在 h****n 的大作中提到】
: 这道题基本上和programming interview expose里面的题差不多
: 只不过里面的是要求flatten双向链表
: 我感觉双向链表更好做,占个位置,稍后上代码

avatar
h*n
15
恩 O(n)时间 O(1)空间
typedef struct nodeT{
struct nodeT * next;
struct nodeT * down;
int value;
}node;
void FlattenSinglyList(node * head)
{
node*tail;
node* cur = head;
while(cur->next)
{
cur=cur->next;
}
tail = cur;
cur = head;
while(cur)
{
if(cur->down)
{
appendToTail(cur->down, tail);
}
}
}
void appendToTail(node* down, node* &tail)
{
node* cur = down;
tail->next = cur;
while(cur->next)
{
cur=cur->next;
}
tail = cur;
}
avatar
i*e
16

讨论一下用两种数据结构实现的时间、空间复杂度:
1)priority_queue (max heap)
2) 100个元素的链表数组
- 使用1)和2)的getPackage() 的时间复杂度都是O(1)
- 对于receive(), 使用priority_queue, 插入是O(lgN), 使用链表数组如果维护一
个指向每个priority链表结尾的指针,插入是O(1)操作。
- 使用1)和2)空间复杂度都是O(N)
- 使用2)查找当前最高priority 链表也是O(1)操作。
所以2)比1)更有效? 这样分析对吗?

【在 b***m 的大作中提到】
: 只说一道吧(因为其它的有些简单,就不浪费大家时间了):设计一个模块,包括类成
: 员和接口,不断receive一些package(从一个stream过来),每个package带一个
: priority number,从1到100,1最低,100最高。有user从该模块不定时取package,要
: 求从priority number最高的package中取最先进来的一个发出去。要考虑时间和空间的
: 效率。

avatar
h*n
17
我的感觉吧,这两种方法效率都可以,但是两者各有侧重
时间上list array方法占优,特别是插入的时候
但是空间上占劣势,想想很多bucket你没用上的情况,如果所有的优先级都是同一种优
先级的话
那么你就白allocate了其他99个cell
avatar
b*m
18

你这个程序貌似有点儿问题?

【在 h****n 的大作中提到】
: 恩 O(n)时间 O(1)空间
: typedef struct nodeT{
: struct nodeT * next;
: struct nodeT * down;
: int value;
: }node;
: void FlattenSinglyList(node * head)
: {
: node*tail;
: node* cur = head;

avatar
p*2
19

二叉树按照inorder变成single linkedlist?

【在 b***m 的大作中提到】
: 有人问起来其它的题,就说一道稍微不简单的吧(对于大牛们还是很简单):Node这样
: 的structure,有next和down两个指针,给定一个head指针(就是说没有其它next和
: down指向它),要求把这个类似二叉树的二维结构的数据组展平(flatten),最后成
: 为只有next指向的类似singly linked list的结构。

avatar
h*n
20
我画个图你就明白了
比如:
head---->node--->node----->node----->node----->NULL
| |
node--->node-->NULL node--->NULL
|
node->NULL
第一次append之后变成:
head---->node--->node----->node----->node--->node--->node---NULL
| |
node--->NULL node-->NULL
第二次append之后变成
head-->node-->node-->node-->node-->node-->node-->node--->NULL
|
node-->NULL
第三次append之后搞定
大概思路就是
遍历list,如果遇到有down指针的就把down指针指向的链表头append到当前list的tail
并更新tail
然后继续往前走,不断这么做,直到走到头
avatar
b*m
21

思路是这样,我刚才可能看得有些眼花。

【在 h****n 的大作中提到】
: 我画个图你就明白了
: 比如:
: head---->node--->node----->node----->node----->NULL
: | |
: node--->node-->NULL node--->NULL
: |
: node->NULL
: 第一次append之后变成:
: head---->node--->node----->node----->node--->node--->node---NULL
: | |

avatar
e*o
22
leetcode的原题吧

【在 b***m 的大作中提到】
: 有人问起来其它的题,就说一道稍微不简单的吧(对于大牛们还是很简单):Node这样
: 的structure,有next和down两个指针,给定一个head指针(就是说没有其它next和
: down指向它),要求把这个类似二叉树的二维结构的数据组展平(flatten),最后成
: 为只有next指向的类似singly linked list的结构。

avatar
b*m
23

LC上的题我做得不全。

【在 e******o 的大作中提到】
: leetcode的原题吧
avatar
f*4
24
会不会重复append?
n0 - n1 - n2 - 0
| | |
0 n3 - n4 - 0
\__/ |
0

【在 h****n 的大作中提到】
: 我画个图你就明白了
: 比如:
: head---->node--->node----->node----->node----->NULL
: | |
: node--->node-->NULL node--->NULL
: |
: node->NULL
: 第一次append之后变成:
: head---->node--->node----->node----->node--->node--->node---NULL
: | |

avatar
j*6
25
问下不用把down指针置为null吗?

【在 h****n 的大作中提到】
: 恩 O(n)时间 O(1)空间
: typedef struct nodeT{
: struct nodeT * next;
: struct nodeT * down;
: int value;
: }node;
: void FlattenSinglyList(node * head)
: {
: node*tail;
: node* cur = head;

avatar
A*u
26
这不是对fresh的问题吧..

【在 b***m 的大作中提到】
: 只说一道吧(因为其它的有些简单,就不浪费大家时间了):设计一个模块,包括类成
: 员和接口,不断receive一些package(从一个stream过来),每个package带一个
: priority number,从1到100,1最低,100最高。有user从该模块不定时取package,要
: 求从priority number最高的package中取最先进来的一个发出去。要考虑时间和空间的
: 效率。

avatar
b*m
27
我不知道呀。

【在 A**u 的大作中提到】
: 这不是对fresh的问题吧..
avatar
I*e
28
大牛拿到Offer没?什么时候给通知?

【在 b***m 的大作中提到】
: 我不知道呀。
avatar
b*m
29

可能要感恩节后了吧。

【在 I*********e 的大作中提到】
: 大牛拿到Offer没?什么时候给通知?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。