Redian新闻
>
NIW-RFE-09.28~~~~~~~~~~~~~~~~~~~~~~~~~~
avatar
NIW-RFE-09.28~~~~~~~~~~~~~~~~~~~~~~~~~~# Immigration - 落地生根
k*r
1
一个记录数组,每个记录的关键字是0,1,2三个数中的一种,
要求将数组按关键字排序。要求算法是稳定排序,O(n)时间,常数空间。
哪位同学说说怎么做?
avatar
f*D
2
Just find out my case status changed
7.6 efile 140
9.28 RFE sent out
Not sure the RFE contents.
Any one wants to work together?
Thanks.
avatar
H*r
3
bucket?

【在 k*******r 的大作中提到】
: 一个记录数组,每个记录的关键字是0,1,2三个数中的一种,
: 要求将数组按关键字排序。要求算法是稳定排序,O(n)时间,常数空间。
: 哪位同学说说怎么做?

avatar
c*g
4
bless

【在 f****D 的大作中提到】
: Just find out my case status changed
: 7.6 efile 140
: 9.28 RFE sent out
: Not sure the RFE contents.
: Any one wants to work together?
: Thanks.

avatar
k*r
5
具体点? 主要是常数空间和稳定排序这两个要求常常互相抵触

【在 H****r 的大作中提到】
: bucket?
avatar
b*r
6
又不提啥建议,光BLESS干啥?

【在 c******g 的大作中提到】
: bless
avatar
w*o
7
counting sort?

【在 k*******r 的大作中提到】
: 一个记录数组,每个记录的关键字是0,1,2三个数中的一种,
: 要求将数组按关键字排序。要求算法是稳定排序,O(n)时间,常数空间。
: 哪位同学说说怎么做?

avatar
k*w
8
收到后看写的什么
avatar
p*2
9
int[] counts=new int[3];
avatar
j*a
10
background?

【在 f****D 的大作中提到】
: Just find out my case status changed
: 7.6 efile 140
: 9.28 RFE sent out
: Not sure the RFE contents.
: Any one wants to work together?
: Thanks.

avatar
Z*Z
11
好像有问题,再想想

【在 k*******r 的大作中提到】
: 具体点? 主要是常数空间和稳定排序这两个要求常常互相抵触
avatar
c*g
12
小弟实在是没啥主意啊

【在 b*********r 的大作中提到】
: 又不提啥建议,光BLESS干啥?
avatar
k*r
13
我觉得应该是 counting sort的思路,但题目没允许有一个额外的输出数组,所以要常
数空间就得在原输入数组中swap 操作,但这样一swap又无法保持是稳定排序。

【在 Z*****Z 的大作中提到】
: 好像有问题,再想想
avatar
e*r
14
先把rfe贴来看看再说.NIW的RFE通常不太难过,表太担心.
板上不最近还有一个嘛.
祝好运

【在 f****D 的大作中提到】
: Just find out my case status changed
: 7.6 efile 140
: 9.28 RFE sent out
: Not sure the RFE contents.
: Any one wants to work together?
: Thanks.

avatar
g*e
15
the dutch flag problem
search google
avatar
k*r
16
赫赫,这应该是正解了,多谢,赞知识广博

【在 g*********e 的大作中提到】
: the dutch flag problem
: search google

avatar
w*o
17
我觉得 你说的不对。
你去研究一下,DNF不是stable,因为它跟quicksort如出一辙,都不是stable的。

【在 g*********e 的大作中提到】
: the dutch flag problem
: search google

avatar
p*2
18
难道 int[3]不算常数空间吗?
avatar
k*r
19
恩,仔细看了看,好像wiki 上DNF给出的排序方法确实是不稳定的,还是有问题啊

【在 w****o 的大作中提到】
: 我觉得 你说的不对。
: 你去研究一下,DNF不是stable,因为它跟quicksort如出一辙,都不是stable的。

avatar
k*r
20
int[3]当然算常数空间,不过具体你的解法是怎样的呢

【在 p*****2 的大作中提到】
: 难道 int[3]不算常数空间吗?
avatar
p*2
21

不好意思。没好好看。还以为是前边一道题呢。

【在 k*******r 的大作中提到】
: int[3]当然算常数空间,不过具体你的解法是怎样的呢
avatar
k*r
22
BTW, 这是facebook 给俺的电面题,让俺非常郁闷
avatar
p*2
23

就这一道题吗?

【在 k*******r 的大作中提到】
: BTW, 这是facebook 给俺的电面题,让俺非常郁闷
avatar
k*r
24
电面嘛,就这一题。我20分钟没做出来,就和对方直接拜拜了

【在 p*****2 的大作中提到】
:
: 就这一道题吗?

avatar
p*2
25

啊?我的经验都是两题,第一题容易,第二题稍难。你申请的什么职位呀?

【在 k*******r 的大作中提到】
: 电面嘛,就这一题。我20分钟没做出来,就和对方直接拜拜了
avatar
k*r
26
就问了我这一道题,题目和职位没关系把?
(不过我在简历中确实吹过自己是算法expert,难道因为这个... 汗)
avatar
p*2
27

那你最后怎么答的?

【在 k*******r 的大作中提到】
: 就问了我这一道题,题目和职位没关系把?
: (不过我在简历中确实吹过自己是算法expert,难道因为这个... 汗)

avatar
k*r
28
我答出的要么不稳定,要么不是常数空间,就这么纠缠了 20 分钟
avatar
P*U
29
没搞明白为啥counting sort不行啊?
avatar
p*2
30

数组里是纪录,不是整数。

【在 P*******U 的大作中提到】
: 没搞明白为啥counting sort不行啊?
avatar
C*U
31
不stable吧
时间是O(n) 空间是O(3)对的

【在 P*******U 的大作中提到】
: 没搞明白为啥counting sort不行啊?
avatar
z*n
32
我也想问问这题怎么解?
Amazon电面的时候也问过类似的问题,一个数组,包含positive,negative, zero 三
种数,要求按照 positive,zero, negative 排序,而且不能改变原记录的相对次序,
O(1)空间。
Dutch flag ship Time-O(n), Space-O(1), 但不是稳定的
我只做出一个O(n^2)的,于是没搞定。
avatar
m*n
33
public static void dutch(int[] A, int size) {
int low =0, mid = 0, high=size-1;
while(lowlow++;
while(high>=0 && A[high]==2)
high--;
mid = low;
//invariants : [0,low) ----> 0
// [low,mid) ---> 1
// [mid, high] ---> unknown
// (high, size-1] ---> 2
while(mid<=high) {
if(A[mid]==0) {
swap(A,mid,low);
low++;
mid++;
}
else if(A[mid]==1) {
mid++;
}
else { //equals to 2
swap(A,high,mid);
high--;
}
}
}
avatar
z*n
34
这个dutch也不是稳定的

【在 m***n 的大作中提到】
: public static void dutch(int[] A, int size) {
: int low =0, mid = 0, high=size-1;
: while(low: low++;
: while(high>=0 && A[high]==2)
: high--;
: mid = low;
: //invariants : [0,low) ----> 0
: // [low,mid) ---> 1
: // [mid, high] ---> unknown

avatar
s*n
35
好了,终于想出来了:
第一遍:count0,1,2的个数l, m, n
第二遍:根据l,m,n很容易确定每个元素最终要挪到哪个位置,把数组元素值改成最终
目的地的下标
第三遍:根据a[i]!=i的条件进行swap到最终位置
第四遍:根据l,m,n恢复数组元素值为0,1,2
avatar
s*n
36
Data a[size];
...
int l=0,m=0;
for (int i=0; iif (a[i].key==0) l++;
else if (a[i].key==1) m++;
else n++;
}
int aidx = 0;
int bidx = 0;
int cidx = 0;
for (int i=0; iif (a[i].key==0) {
a[i].key = aidx++;
} else if (a[i].key==1) {
a[i].key = l + bidx++;
} else {
a[i].key = l + m + cidx++;
}
}
for (int i=0; iwhile (a[i].key!=i) {
int swapIdx = a[i];
Data tmp = a[swapIdx];
a[swapIdx] = a[i];
a[i] = tmp;
}
}
for (int i=0; ifor (int i=l; ifor (int i=l+m; i
avatar
H*r
37
看错题了, 还以为是数组里存的是0,1,2呢,关键字是0,1,2的话就是Dutch
national flag problem

【在 k*******r 的大作中提到】
: 一个记录数组,每个记录的关键字是0,1,2三个数中的一种,
: 要求将数组按关键字排序。要求算法是稳定排序,O(n)时间,常数空间。
: 哪位同学说说怎么做?

avatar
i*7
38
int cnt[3] = {0,0,0};
for(int i = 0; i cnt[a[i]]++;
for(int i = 0; i < cnt[0]; i++)
a[i] = 0;
for(int i = 0; i < cnt[1]; i++)
a[i + cnt[0]] = 1;
for(int i = 0; i < cnt[2]; i++)
a[i + cnt[0] + cnt[1]] = 2;
avatar
s*n
39
Dutch national flag只能保证middle的不打乱,up和low部分全搞乱

【在 H****r 的大作中提到】
: 看错题了, 还以为是数组里存的是0,1,2呢,关键字是0,1,2的话就是Dutch
: national flag problem

avatar
k*r
40
呵呵,感觉这个解法虽然正确,但不是正解,因为万一要求关键字是只能为0,1,2 的
枚举类型,就不能这样干了

【在 s******n 的大作中提到】
: Data a[size];
: ...
: int l=0,m=0;
: for (int i=0; i: if (a[i].key==0) l++;
: else if (a[i].key==1) m++;
: else n++;
: }
: int aidx = 0;
: int bidx = 0;

avatar
t*e
41
I think all above solutions have issues. Can we solve a simplified problem
with just 1 and 2 first with pure swap? Assume each
record has a number and it is not modifiable.
struct record {
const int value;
const int key; //key is just 1 and 2
};
sort(vector a)
{
//fill in.
}
avatar
S*t
42
要求只是说 “要求将数组按关键字排序”
也就是说排序的标准只是关键字而已

【在 s******n 的大作中提到】
: Dutch national flag只能保证middle的不打乱,up和low部分全搞乱
avatar
k*r
43
没这么简单。数组记录还有其他内容,只是关键字是1,2,3

【在 i*********7 的大作中提到】
: int cnt[3] = {0,0,0};
: for(int i = 0; i : cnt[a[i]]++;
: for(int i = 0; i < cnt[0]; i++)
: a[i] = 0;
: for(int i = 0; i < cnt[1]; i++)
: a[i + cnt[0]] = 1;
: for(int i = 0; i < cnt[2]; i++)
: a[i + cnt[0] + cnt[1]] = 2;

avatar
k*r
44
题目要求了必须是稳定排序,也就是关键字相同时原有顺序不能打乱

【在 S***t 的大作中提到】
: 要求只是说 “要求将数组按关键字排序”
: 也就是说排序的标准只是关键字而已

avatar
z*n
45
好办法,不错!
不过,这种方法,平均情况好像是O(n^2)的,可能第三部要swap n次才能swap到合适位
置;
另外,对关键词0,1,2这种情况行,因为可以恢复;
如果是关键字是正数、0、负数,按照 >0, =0, <0 进行分,感觉就不行了,最后没法
恢复。

【在 s******n 的大作中提到】
: 好了,终于想出来了:
: 第一遍:count0,1,2的个数l, m, n
: 第二遍:根据l,m,n很容易确定每个元素最终要挪到哪个位置,把数组元素值改成最终
: 目的地的下标
: 第三遍:根据a[i]!=i的条件进行swap到最终位置
: 第四遍:根据l,m,n恢复数组元素值为0,1,2

avatar
z*4
46
这个swap的step应该是O(n)吧,找和自己value做index

【在 z*****n 的大作中提到】
: 好办法,不错!
: 不过,这种方法,平均情况好像是O(n^2)的,可能第三部要swap n次才能swap到合适位
: 置;
: 另外,对关键词0,1,2这种情况行,因为可以恢复;
: 如果是关键字是正数、0、负数,按照 >0, =0, <0 进行分,感觉就不行了,最后没法
: 恢复。

avatar
H*r
47
If stable sorting desired then it's getting complicated. There's some
article on this:
"Stable minimum space partitioning in linear time"
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.555

【在 k*******r 的大作中提到】
: 没这么简单。数组记录还有其他内容,只是关键字是1,2,3
avatar
H*r
48
frankly speaking I didnt read that article in detail but i dont think that
solution is desired in a normal interview...

【在 H****r 的大作中提到】
: If stable sorting desired then it's getting complicated. There's some
: article on this:
: "Stable minimum space partitioning in linear time"
: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.555

avatar
t*e
49
Yes. This paper is indeed talking about the same problem. It is too hard for
an interview.
avatar
s*n
50
每个元素最多swap两次就能到位,所以是O(n)的

【在 z*****n 的大作中提到】
: 好办法,不错!
: 不过,这种方法,平均情况好像是O(n^2)的,可能第三部要swap n次才能swap到合适位
: 置;
: 另外,对关键词0,1,2这种情况行,因为可以恢复;
: 如果是关键字是正数、0、负数,按照 >0, =0, <0 进行分,感觉就不行了,最后没法
: 恢复。

avatar
H*r
51
// the following requires key is of type int or unsigned int
a[i].key = aidx++;
// which might not be true. The key might be only 2 bits for "00", "01", and
"10"

【在 s******n 的大作中提到】
: Data a[size];
: ...
: int l=0,m=0;
: for (int i=0; i: if (a[i].key==0) l++;
: else if (a[i].key==1) m++;
: else n++;
: }
: int aidx = 0;
: int bidx = 0;

avatar
k*r
52
但既然已经有2个公司把这个题目当作电面了,难道存在一个cheap answer?
我大致看了一下Hector贴的那篇论文,满足要求的应该是简化后的algorithm D.
但论文没详细描述,只说
a simple algorithm exists which is based on the wheel technique [Programming Pearls, Section 10.2].)
哪位有这本书的说说这个wheel technique是个什么东西?

for

【在 t********e 的大作中提到】
: Yes. This paper is indeed talking about the same problem. It is too hard for
: an interview.

avatar
d*u
53
Dutch national flag中间的也会乱

【在 s******n 的大作中提到】
: Dutch national flag只能保证middle的不打乱,up和low部分全搞乱
avatar
A*u
54
这个题目大家怎么讨论的这么火热
用counting sort 思路可以吗?
开一个int[3] 算是O(1)吧.
然后像counting sort,
从后往前恢复序列, 不就是O(N), O(1)算法

【在 s******n 的大作中提到】
: Dutch national flag只能保证middle的不打乱,up和low部分全搞乱
avatar
a*y
55
俺写了一个, 没有测试过只有1, 2, 或者0 的情况...
请高手指正...
思路就是维护了三个指针p0, p1, p2, 分别指向了数组index最小的0, 1, 2值所在位置,
然后遍历的过程中,不断swap(值和指针同时swap), 复杂度为O(n), 常数空间.
请高手们多指正了!
#include
#include
using namespace std;
class MITbbSolver
{
public:
MITbbSolver() {}
virtual ~MITbbSolver() {}
public:
void swap_pv(int* &p1, int* &p2) {
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
int* p = p1;
p1 = p2;
p2 = p;
return;
}
void sort_012_array(int* a, int n)
{
if (NULL==a || n<1) return;
int *p1, *p2, *p0;
p0 = p1 = p2 = NULL;
int i;
int* p = NULL, *pcur = NULL;
for (i = 0; i < n; i++) {
if (a[i]==0 && NULL==p0) {
p0 = a + i;
break;
}
}
if (p0 != a) {
pcur = a;
swap_pv(p0, pcur);
}
for (pcur = p0; pcur < a + n; pcur++) {
if (*pcur==1 && NULL==p1) {
p1 = pcur;
}
if (*pcur==2 && NULL==p2) {
p2 = pcur;
}
}
if (p1==NULL && p2==NULL) {
return;
}
if (p1 > p2) {
swap_pv(p1, p2);
}
for (pcur = p1; pcur < a + n; pcur++) {
if (*pcur==2) {
p2 = pcur;
break;
}
}
for (i = 0; i < n; i++) {
p = a + i;
if (*p==0 && p>p1) {
pcur = p;
if (pcur > p1) {
swap_pv(pcur, p1);
p1 = pcur + 1;
}
if (p1 > p2) {
swap_pv(p1, p2);
p2 = p1 + 1;
}
}
if (*p==1 && p>p2) {
pcur = p;
if (pcur > p2) {
swap_pv(pcur, p2);
p2 = pcur + 1;
}
}
} //for//
return;
}
void test_sort_012_array()
{
int a[] = {0, 2, 2, 2, 1, 1, 1, 0, 1, 2, 0, 0, 2, 2, 1, 1};
int n = sizeof(a) / sizeof(a[0]);
// original
copy(a, a+n, ostream_iterator(cout, " "));
cout << endl;
sort_012_array(a, n);
// sorted result
copy(a, a+n, ostream_iterator(cout, " "));
cout << endl;
return;
}
};
avatar
a*y
56
好像不是stable的... = =
等高手解答吧....
avatar
a*y
57
swan 兄弟的这个我觉得是完全符合要求的, 不知道还有哪里需要改进的??
求指导...

【在 s******n 的大作中提到】
: 好了,终于想出来了:
: 第一遍:count0,1,2的个数l, m, n
: 第二遍:根据l,m,n很容易确定每个元素最终要挪到哪个位置,把数组元素值改成最终
: 目的地的下标
: 第三遍:根据a[i]!=i的条件进行swap到最终位置
: 第四遍:根据l,m,n恢复数组元素值为0,1,2

avatar
X*K
58
我觉得不能假定数组里存的就是数字123,如果是这样的话那直接counting sort就好
了。题目里说了数组存的是一条条记录,而这些记录的关健字是123,所以得假定数组
里放的是记录指针,这样就不能改成数组下标。

【在 a***y 的大作中提到】
: swan 兄弟的这个我觉得是完全符合要求的, 不知道还有哪里需要改进的??
: 求指导...

avatar
t*e
59

This is a good solution. But I think changing key can be counted as O(N)
space is used. This may be what interviewer want though.

【在 a***y 的大作中提到】
: swan 兄弟的这个我觉得是完全符合要求的, 不知道还有哪里需要改进的??
: 求指导...

avatar
s*n
60
稳定吗?假设数组是 2,2,0,...你第一步把0和2对调,打乱了两个2的次序。

【在 a***y 的大作中提到】
: swan 兄弟的这个我觉得是完全符合要求的, 不知道还有哪里需要改进的??
: 求指导...

avatar
d*u
61
为什么最多swap两次就能到位?

【在 s******n 的大作中提到】
: 每个元素最多swap两次就能到位,所以是O(n)的
avatar
n*t
62
swap那步总共需要o(n^2),同不理解为啥每回两次到位

【在 d**u 的大作中提到】
: 为什么最多swap两次就能到位?
avatar
A*u
63
是O(N)
若A[i] != i;
假设A[i] = k; swap(A[i],A[k]), 那么A[k] = k了.
如果A[i] 还是 A[i] != i, 继续
因此,每次swap,都会使得一个 A[x] == x.
所以O(N)
for(int i = 0; i < N; ++i)
{
while ( A[i] != i ){
int k = A[i];
swap(A[i],A[k]);
}
}
swan的方法真好

【在 n*******t 的大作中提到】
: swap那步总共需要o(n^2),同不理解为啥每回两次到位
avatar
h*e
64
i don't think his method is good.. it is a trivial problem if you are
allowed to change the content
avatar
l*i
65
这个是老题了,有人写了篇paper,好像要用到permutation group。总之interview拿
这个来考别人的就是诚心不让你过的,没啥意思。给solution的同学以后能不能给个大
概思路加上证明思路,单纯给code大多数不明白
avatar
c*x
66
这题挺难的
0,1,2肯定是value,如果直接是数组元素的话就没有必要stable了。
用到swap基本就不stable了。
avatar
h*9
67

花了两三分钟自己想了出来,然后看到你这个,google后发现和我想的完全一样,哈哈。

【在 g*********e 的大作中提到】
: the dutch flag problem
: search google

avatar
l*t
68
可以这样做
step1 记录数组里面有多少 0,1,2
num_0 = num_of_0;
num_1 = num_of_1;
num_2 = num_of_2;
0 to num0 为zone1 num0 to num0+num1 定义为zone2 num0+num1 to num0+num1+num2
定义为zone3
step2
zone1里面 如果是0 不动 如果是2 和zone3里面的0互换
这样zone1和zone3 里面 一个有0,1,2,一个只有0,1 或者1,2
假设是0,1的情况 也就是zone1只剩下0,1,zone3还有0,1,2
那么扫zone2, 把里面的2 全部和zone3里面的0交换
这样可以保证 zone1只有0,1, zone2有0,1,2, zone3 只有1,2
接下来zone1里面的1和zone2里面的0换
zone3 里面的1和zone2里面的2换
这样 zone1只有0 zone2只有1 zone3只有2
avatar
l*t
69
可以这样做
step1 记录数组里面有多少 0,1,2
num_0 = num_of_0;
num_1 = num_of_1;
num_2 = num_of_2;
0 to num0 为zone1 num0 to num0+num1 定义为zone2 num0+num1 to num0+num1+num2
定义为zone3
step2
zone1里面 如果是0 不动 如果是2 和zone3里面的0互换
这样zone1和zone3 里面 一个有0,1,2,一个只有0,1 或者1,2
假设是0,1的情况 也就是zone1只剩下0,1,zone3还有0,1,2
那么扫zone2, 把里面的2 全部和zone3里面的0交换
这样可以保证 zone1只有0,1, zone2有0,1,2, zone3 只有1,2
接下来zone1里面的1和zone2里面的0换
zone3 里面的1和zone2里面的2换
这样 zone1只有0 zone2只有1 zone3只有2
avatar
g*y
70
这个方法有问题。zone1 0的位置不一定是排序以后的问题。
step2
zone1里面 如果是0 不动

num2

【在 l********t 的大作中提到】
: 可以这样做
: step1 记录数组里面有多少 0,1,2
: num_0 = num_of_0;
: num_1 = num_of_1;
: num_2 = num_of_2;
: 0 to num0 为zone1 num0 to num0+num1 定义为zone2 num0+num1 to num0+num1+num2
: 定义为zone3
: step2
: zone1里面 如果是0 不动 如果是2 和zone3里面的0互换
: 这样zone1和zone3 里面 一个有0,1,2,一个只有0,1 或者1,2

avatar
R*1
71
不是 color sort吗?排序0,1,2序列?
某大牛前几天刚贴出来很elegant的code
--不好意思,没看到stable的要求……
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。