由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道facebook的面试题
相关主题
一道算法题目问道面试题
Facebook Interview QuestionsAn interview question of finding the median in a moving window.
一道面试题。职业杯另外一道
Pure Storage面经问道题,应该是常被问到,可找不到好的alg
求指点一道G家Iterator的题目what is the internal implementation of Deque
问个题目,找不在区间内的所有数前面那google题删贴了?
问个最近面试里的题目讨论一个题目
L家的高频题merge k sorted arrays giving iterators求讨论!一个实际碰到的问题
相关话题的讨论汇总
话题: int话题: childsize话题: actualsize话题: data
进入JobHunting版参与讨论
1 (共1页)
r***6
发帖数: 15
1
有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
大值。
例如,
有数组 2,3,4,2,6,7,8,2,4,1,2,3
k = 3
输出
4,4,6,7,8,8,8,4,4,4
有什么好一点的解法吗。
b***e
发帖数: 15201
2
use heap?

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

n**4
发帖数: 719
3
use a queue
keep the biggest value at the head of the queue
P*A
发帖数: 189
4
Maintain a Binary Search Tree,
with a pointer to the max node,
Every time you insert a new element, update the pointer if necessary.

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

g**********y
发帖数: 14569
5
public int[] getWindowMax(int[] a, int w) {
int[] b = new int[a.length - w + 1];

ArrayDeque q = new ArrayDeque();
for (int i=0; i while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
q.addLast(i);
}

b[0] = a[q.peekFirst()];
for (int i=w; i while (!q.isEmpty() && q.peekFirst()<=i-w) q.pop();
while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
q.addLast(i);
b[i-w+1] = a[q.peekFirst()];
}

return b;
}
如果有问题,去读ihasleetcode的网站。
b******v
发帖数: 1493
6
时间复杂性是什么?

【在 g**********y 的大作中提到】
: public int[] getWindowMax(int[] a, int w) {
: int[] b = new int[a.length - w + 1];
:
: ArrayDeque q = new ArrayDeque();
: for (int i=0; i: while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
: q.addLast(i);
: }
:
: b[0] = a[q.peekFirst()];

y*****z
发帖数: 9
7
ST 算法 + RMQ
R******9
发帖数: 267
8
#include
#include
#include
using namespace std;
void PrintMaxInWindow(int a[], int n, int k){
set s;
int i=0;
for(;i s.insert(a[i]);
set::reverse_iterator rit;
for(;i<=n;i++){
rit = s.rbegin();
cout<<*rit<<"\t";
s.erase(a[i-k]);
s.insert(a[i]);
}
}

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

h*********r
发帖数: 74
9
单调队列吧~
b***z
发帖数: 921
10
Use max-heap.

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

相关主题
问个题目,找不在区间内的所有数问道面试题
问个最近面试里的题目An interview question of finding the median in a moving window.
L家的高频题merge k sorted arrays giving iterators求讨论!职业杯另外一道
进入JobHunting版参与讨论
P***P
发帖数: 1387
11
这题o(n)
就是implement a queue with getMax().
有点像crack150里面的stack with getMax()
public void addLast(T data) {
// insert data to the data queue.
dataQ.add(data);
// adjust the auxiliary queue.
while (!auxiQ.isEmpty() && auxiQ.getLast().compareTo(data) < 0) {
auxiQ.removeLast();
}
auxiQ.add(data); //append to the end.
}
public T getMax() {
return auxiQ.getFirst();
}
public T removeFirst() {
T data = dataQ.removeFirst();
// adjust the auxiliary queue. Because the previous max is removed, the
// head (which is the current max) should be removed too.
if (data == auxiQ.getFirst()) {
auxiQ.removeFirst();
}
return data;
}
b***u
发帖数: 12010
12
可以用c++的map,每次存 reverse iterator的第一个,删find i-2
不过好像挺作弊。

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

b***u
发帖数: 12010
13
heap找arr[i-3]不是很容易吧。

【在 b***e 的大作中提到】
: use heap?
b***u
发帖数: 12010
14
set好像不是sorted的吧?要用map

【在 R******9 的大作中提到】
: #include
: #include
: #include
: using namespace std;
: void PrintMaxInWindow(int a[], int n, int k){
: set s;
: int i=0;
: for(;i: s.insert(a[i]);
: set::reverse_iterator rit;

z******t
发帖数: 59
15
Share a blog with two solutions of this problem:
http://codercareer.blogspot.com/2012/02/no-33-maximums-in-slidi
Enjoy it:)

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

r***6
发帖数: 15
16
有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
大值。
例如,
有数组 2,3,4,2,6,7,8,2,4,1,2,3
k = 3
输出
4,4,6,7,8,8,8,4,4,4
有什么好一点的解法吗。
b***e
发帖数: 15201
17
use heap?

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

n**4
发帖数: 719
18
use a queue
keep the biggest value at the head of the queue
P*A
发帖数: 189
19
Maintain a Binary Search Tree,
with a pointer to the max node,
Every time you insert a new element, update the pointer if necessary.

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

g**********y
发帖数: 14569
20
public int[] getWindowMax(int[] a, int w) {
int[] b = new int[a.length - w + 1];

ArrayDeque q = new ArrayDeque();
for (int i=0; i while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
q.addLast(i);
}

b[0] = a[q.peekFirst()];
for (int i=w; i while (!q.isEmpty() && q.peekFirst()<=i-w) q.pop();
while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
q.addLast(i);
b[i-w+1] = a[q.peekFirst()];
}

return b;
}
如果有问题,去读ihasleetcode的网站。
相关主题
问道题,应该是常被问到,可找不到好的alg讨论一个题目
what is the internal implementation of Deque一个实际碰到的问题
前面那google题删贴了?combinations 有没有 iterative的方法阿 ?
进入JobHunting版参与讨论
b******v
发帖数: 1493
21
时间复杂性是什么?

【在 g**********y 的大作中提到】
: public int[] getWindowMax(int[] a, int w) {
: int[] b = new int[a.length - w + 1];
:
: ArrayDeque q = new ArrayDeque();
: for (int i=0; i: while (!q.isEmpty() && a[q.peekLast()]<=a[i]) q.removeLast();
: q.addLast(i);
: }
:
: b[0] = a[q.peekFirst()];

y*****z
发帖数: 9
22
ST 算法 + RMQ
R******9
发帖数: 267
23
#include
#include
#include
using namespace std;
void PrintMaxInWindow(int a[], int n, int k){
set s;
int i=0;
for(;i s.insert(a[i]);
set::reverse_iterator rit;
for(;i<=n;i++){
rit = s.rbegin();
cout<<*rit<<"\t";
s.erase(a[i-k]);
s.insert(a[i]);
}
}

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

h*********r
发帖数: 74
24
单调队列吧~
b***z
发帖数: 921
25
Use max-heap.

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

P***P
发帖数: 1387
26
这题o(n)
就是implement a queue with getMax().
有点像crack150里面的stack with getMax()
public void addLast(T data) {
// insert data to the data queue.
dataQ.add(data);
// adjust the auxiliary queue.
while (!auxiQ.isEmpty() && auxiQ.getLast().compareTo(data) < 0) {
auxiQ.removeLast();
}
auxiQ.add(data); //append to the end.
}
public T getMax() {
return auxiQ.getFirst();
}
public T removeFirst() {
T data = dataQ.removeFirst();
// adjust the auxiliary queue. Because the previous max is removed, the
// head (which is the current max) should be removed too.
if (data == auxiQ.getFirst()) {
auxiQ.removeFirst();
}
return data;
}
b***u
发帖数: 12010
27
可以用c++的map,每次存 reverse iterator的第一个,删find i-2
不过好像挺作弊。

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

b***u
发帖数: 12010
28
heap找arr[i-3]不是很容易吧。

【在 b***e 的大作中提到】
: use heap?
b***u
发帖数: 12010
29
set好像不是sorted的吧?要用map

【在 R******9 的大作中提到】
: #include
: #include
: #include
: using namespace std;
: void PrintMaxInWindow(int a[], int n, int k){
: set s;
: int i=0;
: for(;i: s.insert(a[i]);
: set::reverse_iterator rit;

z******t
发帖数: 59
30
Share a blog with two solutions of this problem:
http://codercareer.blogspot.com/2012/02/no-33-maximums-in-slidi
Enjoy it:)

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

相关主题
刷了半天题Facebook Interview Questions
问道G家算法题一道面试题。
一道算法题目Pure Storage面经
进入JobHunting版参与讨论
t*****j
发帖数: 1105
31
用数组实现的Q...
当然咯,用vector可以省去很多code。
void subMost(int* parentArray, int parentSize, int childSize)
{
int* valueArray = new int[childSize];
int* positionArray = new int[childSize];
int actualSize = 0;
int childFrontIndex = 0;
int childEndIndex = -1;
for(int i=0; i< parentSize+childSize-1; i++)
{
if(i>=childSize)
{
if(positionArray[childFrontIndex] == i-childSize)
{
childFrontIndex = (childFrontIndex++)%childSize;
actualSize --;
}
}
if(i < parentSize)
{
while((valueArray[childEndIndex] < parentArray[i]) && (
actualSize >0))
{
childEndIndex --;
actualSize --;
if((childEndIndex < 0) && (actualSize > 0) )
{
childEndIndex = childSize-1;
}
}
childEndIndex = (childEndIndex ++)%childSize;
valueArray[childEndIndex] = parentArray[i];
positionArray[childEndIndex] = i;
actualSize = actualSize++;
}
cout << valueArray[childFrontIndex] << endl;
}
delete valueArray;
delete positionArray;
}
test过了...

【在 r***6 的大作中提到】
: 有一无序数组长度为n,以及一个可以从左到右移动的子数组,长度为k。
: 假设子数组起始位置为0,要求在子数组从最左到最右的移动过程中,输出子数组的最
: 大值。
: 例如,
: 有数组 2,3,4,2,6,7,8,2,4,1,2,3
: k = 3
: 输出
: 4,4,6,7,8,8,8,4,4,4
: 有什么好一点的解法吗。

g*********e
发帖数: 14401
32
leetcode上有这道题,貌似是两个queue
p*****2
发帖数: 21240
33

我前几天做了,好像一个就可以了。

【在 g*********e 的大作中提到】
: leetcode上有这道题,貌似是两个queue
M***t
发帖数: 1636
34
你看2月16号的帖子,何海涛本人给了他的解

【在 p*****2 的大作中提到】
:
: 我前几天做了,好像一个就可以了。

1 (共1页)
进入JobHunting版参与讨论
相关主题
一个实际碰到的问题求指点一道G家Iterator的题目
combinations 有没有 iterative的方法阿 ?问个题目,找不在区间内的所有数
刷了半天题问个最近面试里的题目
问道G家算法题L家的高频题merge k sorted arrays giving iterators求讨论!
一道算法题目问道面试题
Facebook Interview QuestionsAn interview question of finding the median in a moving window.
一道面试题。职业杯另外一道
Pure Storage面经问道题,应该是常被问到,可找不到好的alg
相关话题的讨论汇总
话题: int话题: childsize话题: actualsize话题: data