Redian新闻
>
问Thomson Reuters两道算法题
avatar
问Thomson Reuters两道算法题# JobHunting - 待字闺中
b*h
1
1. 一个array当中,每个element都是一个带一种颜色的小球。有20种颜色的选择。排
序,将相同颜色的小球放在一起。 要求linear time and in-place.
in-place, 我的理解就是不能再用一个array装重新的排序的小球。
2.如何判断两个矩形overlap. 用最少的判断条件。
这道题是一道经典题吧,隐约好像以前见过。
自己给出的方案: 分别判断两边有没有overlap,就是x方向和y方向的线段有没有重叠
的部分,如果两个方向都有的话,两个矩形overlap。
不知道有没有其他方法。
avatar
r*y
2
1, construct a hash table of size 20 firstly to find the interval of
one color balls in the sorted array ?

【在 b*******h 的大作中提到】
: 1. 一个array当中,每个element都是一个带一种颜色的小球。有20种颜色的选择。排
: 序,将相同颜色的小球放在一起。 要求linear time and in-place.
: in-place, 我的理解就是不能再用一个array装重新的排序的小球。
: 2.如何判断两个矩形overlap. 用最少的判断条件。
: 这道题是一道经典题吧,隐约好像以前见过。
: 自己给出的方案: 分别判断两边有没有overlap,就是x方向和y方向的线段有没有重叠
: 的部分,如果两个方向都有的话,两个矩形overlap。
: 不知道有没有其他方法。

avatar
g*e
3
1. http://en.wikipedia.org/wiki/Dutch_national_flag_problem
2. check programing interview exposed

【在 b*******h 的大作中提到】
: 1. 一个array当中,每个element都是一个带一种颜色的小球。有20种颜色的选择。排
: 序,将相同颜色的小球放在一起。 要求linear time and in-place.
: in-place, 我的理解就是不能再用一个array装重新的排序的小球。
: 2.如何判断两个矩形overlap. 用最少的判断条件。
: 这道题是一道经典题吧,隐约好像以前见过。
: 自己给出的方案: 分别判断两边有没有overlap,就是x方向和y方向的线段有没有重叠
: 的部分,如果两个方向都有的话,两个矩形overlap。
: 不知道有没有其他方法。

avatar
g*e
7
理论上说是可以,但是代码会非常复杂
有什么更好的idea吗?

【在 f****4 的大作中提到】
: q1 难道要多次调用Dutch_national_flag_problem?
avatar
g*s
8
no.
scan once, use 20 variables to count each color. (n)
Then use 20 pointers and in-place swap to scan. (n*2) -- similar with the
algo to swap k to kth. but here swap k to k-th block.
space O(20)

【在 f****4 的大作中提到】
: q1 难道要多次调用Dutch_national_flag_problem?
avatar
g*y
9
代码不复杂吧。反正固定20种颜色,每种都往头上换,不停挪指针,复杂度还是O(N)。

【在 g**e 的大作中提到】
: 理论上说是可以,但是代码会非常复杂
: 有什么更好的idea吗?

avatar
s*y
10
我还以为不可以申请额外空间呢。

【在 g***s 的大作中提到】
: no.
: scan once, use 20 variables to count each color. (n)
: Then use 20 pointers and in-place swap to scan. (n*2) -- similar with the
: algo to swap k to kth. but here swap k to k-th block.
: space O(20)

avatar
g*s
11
O(20), can be thought as O(1).
any algo needs extra variables.

【在 s*****y 的大作中提到】
: 我还以为不可以申请额外空间呢。
avatar
g*e
12
不得20个case switch吗

【在 g**********y 的大作中提到】
: 代码不复杂吧。反正固定20种颜色,每种都往头上换,不停挪指针,复杂度还是O(N)。
avatar
g*y
13
颜色应该存在给定数组里,可以假设已经排好序了。我想这些都是枝节问题,面试官不
在乎的。

【在 g**e 的大作中提到】
: 不得20个case switch吗
avatar
f*4
14
抛个没有count的;一次写对还是有难度的
grass的count的办法能简化代码
#include
int k = 0;
int pts[k+1]; //pts[0] for color 1; pts[k-1] for color k; pts[k] is the
current index in balls
void printArray(int *arr, int length)
{
for(int i = 0; i < length; i++)
printf("%d,",arr[i]);
printf("\n");
}
void KquickSortPartition(int *arr, int length)
{
if (arr == NULL || length == 0 || k <= 0) return;
printArray(arr, length);
for (int i = 0; i < k+1; i++)
pts[i] = 0;
int ball;
int color;
while (pts[k]< length)
{
// current color
color = arr[pts[k]];
for (int j = k; j > color; j--)
{
ball = arr[pts[j]];
arr[pts[j]] = arr[pts[j-1]];
arr[pts[j-1]] = ball;
}
for (int j = color; j <= k; j++)
pts[j]+=1;
// printArray(pts, k+1);
}
printArray(arr, length);
printf("\n");
}
int main ()
{
k = 4;
int balls1[] = {1,1,2,4,1,2,1,2,4,4,4,2,3,4,3,4,3,4,2,3,4,2,3,3,4,1};
KquickSortPartition(balls1, sizeof(balls1)/sizeof(int));
int balls2[] = {3,3,3,3,3,1,1,1,4,4,4,4};
KquickSortPartition(balls2, sizeof(balls2)/sizeof(int));
int balls3[] = {1,1,1};
KquickSortPartition(balls3, sizeof(balls3)/sizeof(int));
int balls4[] = {4,4,4};
KquickSortPartition(balls4, sizeof(balls4)/sizeof(int));
int balls5[] = {1,2,3,4,1,2,3,4,1,2,3,4};
KquickSortPartition(balls5, sizeof(balls5)/sizeof(int));
k = 1;
int balls6[] = {1,1,1,1,1};
KquickSortPartition(balls6, sizeof(balls6)/sizeof(int));
}
avatar
d*d
15
我认为用hash数个数再放回去是正解.

【在 r*******y 的大作中提到】
: 1, construct a hash table of size 20 firstly to find the interval of
: one color balls in the sorted array ?

avatar
g*s
16
This codes are not O(N).

【在 f****4 的大作中提到】
: 抛个没有count的;一次写对还是有难度的
: grass的count的办法能简化代码
: #include
: int k = 0;
: int pts[k+1]; //pts[0] for color 1; pts[k-1] for color k; pts[k] is the
: current index in balls
: void printArray(int *arr, int length)
: {
: for(int i = 0; i < length; i++)
: printf("%d,",arr[i]);

avatar
d*d
17
第二题可没说这两矩形平行于坐标轴阿

【在 b*******h 的大作中提到】
: 1. 一个array当中,每个element都是一个带一种颜色的小球。有20种颜色的选择。排
: 序,将相同颜色的小球放在一起。 要求linear time and in-place.
: in-place, 我的理解就是不能再用一个array装重新的排序的小球。
: 2.如何判断两个矩形overlap. 用最少的判断条件。
: 这道题是一道经典题吧,隐约好像以前见过。
: 自己给出的方案: 分别判断两边有没有overlap,就是x方向和y方向的线段有没有重叠
: 的部分,如果两个方向都有的话,两个矩形overlap。
: 不知道有没有其他方法。

avatar
g*s
18
public class ColorBalls {
public static void arrange(int[] balls, int colorNum){
int[] count = new int[colorNum];
int[] pointers = new int[colorNum];
//count color
for (int color : balls) count[color]++;
//set the pointers
for (int i=0;ipointers[i+1] += pointers[i] + count[i];
}
int currentColor = 0;
int c = count[currentColor];
for (int pos=0;posif (c==0){
c = count[++currentColor];
continue;
}
if (balls[pos]!=currentColor){
swap(balls, pos, pointers[balls[pos]]++);
} else {
pos++;c--;
}
}
}
private static void swap(int[] balls, int p1, int p2) {
int t = balls[p1];
balls[p1] = balls[p2];
balls[p2] = t;
}
public static void main(String[] args) {
final int N = 100;
final int COLOR_NUM = 20;
int[] balls = new int[N];
Random random = new Random() ;
for (int i=0;irandom.nextInt(COLOR_NUM);
arrange(balls,COLOR_NUM);
System.out.println(Arrays.toString(balls));
}
}

the

【在 g***s 的大作中提到】
: no.
: scan once, use 20 variables to count each color. (n)
: Then use 20 pointers and in-place swap to scan. (n*2) -- similar with the
: algo to swap k to kth. but here swap k to k-th block.
: space O(20)

avatar
g*s
19
check gate's posts.

【在 d*******d 的大作中提到】
: 第二题可没说这两矩形平行于坐标轴阿
avatar
f*4
20
这里最坏是O(kN)
k=20的时候,不能认为是 O(N)?

【在 g***s 的大作中提到】
: This codes are not O(N).
avatar
g*s
21
oh. yes, you are right.
but we can finish it in O(3*N).

【在 f****4 的大作中提到】
: 这里最坏是O(kN)
: k=20的时候,不能认为是 O(N)?

avatar
f*4
22
恩,用count是简单很多
我那个是上次看到有人给问到类似问题,但要求in-place, O(N)并且不允许用count的
办法,才写的

【在 g***s 的大作中提到】
: oh. yes, you are right.
: but we can finish it in O(3*N).

avatar
g*y
23
如果用count的话,count完为什么不直接赋值?反正都是整数。
avatar
g*s
24
Since it could be a Node inlcuding other fields.

【在 g**********y 的大作中提到】
: 如果用count的话,count完为什么不直接赋值?反正都是整数。
avatar
d*d
25
其实你那个和count是一码事,只不过count的内容变了一点而已.

【在 f****4 的大作中提到】
: 恩,用count是简单很多
: 我那个是上次看到有人给问到类似问题,但要求in-place, O(N)并且不允许用count的
: 办法,才写的

avatar
f*4
26
你是指都用了k个指针的插入?
count直接把每个指针所在的位置放好了
我的k个指针都是从0开始的

【在 d*******d 的大作中提到】
: 其实你那个和count是一码事,只不过count的内容变了一点而已.
avatar
w*3
27
counting 以后直接填似乎简单一点
int[] cntAry = new int[21];
public int[] solve(int[] bary) {
for (int v : bary) {
cntAry[v]++;
}
int tmp = 0, total = 0;

for (int i = 0; i < cntAry.length; ++i) {
tmp = cntAry[i];
cntAry[i] = total;
total += tmp;
}
for(int i = 0; i< cntAry.length - 1; ++i){
for(int j = cntAry[i]; j < cntAry[i+1]; ++j){
bary[j] = i;
}
}

return bary;
}
avatar
g*s
28
This is not general solution,since the ball Node could have more fields.

【在 w*****3 的大作中提到】
: counting 以后直接填似乎简单一点
: int[] cntAry = new int[21];
: public int[] solve(int[] bary) {
: for (int v : bary) {
: cntAry[v]++;
: }
: int tmp = 0, total = 0;
:
: for (int i = 0; i < cntAry.length; ++i) {
: tmp = cntAry[i];

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