由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - Google on campus 面经
相关主题
请教一个老算法题, k-th largest sumGoogle电话面试题目
求这道题的O(N)解 (转载)a question about combination
details 2nd smallest element in an array一道老题
请教一个题: Median of Two Sorted Arrays也问一个算法题
再论 mini # of swaps to sort array.问个面试题
一道不错的算法题问一道brainteaser
leetcode jump game2careercup上这道题我竟然没看懂
这题怎么做?find median for k sorted arrays
相关话题的讨论汇总
话题: int话题: array话题: max话题: num话题: 33
进入JobHunting版参与讨论
1 (共1页)
f****9
发帖数: 506
1
两人,没人45分钟。
第一个:从一个array里找出等于t的数,把它们放到array后面,其他元素相对位置保
持不变,顺次迁移;
第二个:一个m x n的方格,从左上角到右下角走,只能向右或向下,总共几种走法。
问题很简单又是老题。我也都答出来了,code也写了。第二个问题我开始用计算组合数
的方法,面试官还没见过这种解法。但是最后仍然被拒了。感觉可能是答题太慢了?或
者听力不好老让第一个面试官重复问题?没办法。。。
X*********n
发帖数: 570
2
第二题dp啊
设每个格的走法为t(x,y),
if (x==1||y==1)
t(x, y)=1
else
t(x, y)=t(x-1, y)+t(x, y-1)

【在 f****9 的大作中提到】
: 两人,没人45分钟。
: 第一个:从一个array里找出等于t的数,把它们放到array后面,其他元素相对位置保
: 持不变,顺次迁移;
: 第二个:一个m x n的方格,从左上角到右下角走,只能向右或向下,总共几种走法。
: 问题很简单又是老题。我也都答出来了,code也写了。第二个问题我开始用计算组合数
: 的方法,面试官还没见过这种解法。但是最后仍然被拒了。感觉可能是答题太慢了?或
: 者听力不好老让第一个面试官重复问题?没办法。。。

r***u
发帖数: 241
3
显然是组合数学的方法好啊

【在 X*********n 的大作中提到】
: 第二题dp啊
: 设每个格的走法为t(x,y),
: if (x==1||y==1)
: t(x, y)=1
: else
: t(x, y)=t(x-1, y)+t(x, y-1)

X*********n
发帖数: 570
4
解释下呢?

【在 r***u 的大作中提到】
: 显然是组合数学的方法好啊
f****9
发帖数: 506
5
我说用dp了。
感觉挺莫名其妙被拒的。第一个面试官问完了还说it‘s good,第二个面试官连计算组
合数的方法都不会。
可能是我听力不太好交流有点问题让他们印象是比较笨?还是我答题太慢了?莫非这种
难度的题45分钟应该完成多个,每个都在白板上完成code,才算合格了?

【在 X*********n 的大作中提到】
: 第二题dp啊
: 设每个格的走法为t(x,y),
: if (x==1||y==1)
: t(x, y)=1
: else
: t(x, y)=t(x-1, y)+t(x, y-1)

P*******7
发帖数: 55
6
第二题很简单,不用dp,等价于m+n个数里面取m个数,答案是c(m+n, m)

【在 f****9 的大作中提到】
: 两人,没人45分钟。
: 第一个:从一个array里找出等于t的数,把它们放到array后面,其他元素相对位置保
: 持不变,顺次迁移;
: 第二个:一个m x n的方格,从左上角到右下角走,只能向右或向下,总共几种走法。
: 问题很简单又是老题。我也都答出来了,code也写了。第二个问题我开始用计算组合数
: 的方法,面试官还没见过这种解法。但是最后仍然被拒了。感觉可能是答题太慢了?或
: 者听力不好老让第一个面试官重复问题?没办法。。。

f****9
发帖数: 506
7
我说了,面试官还没见过用组合数的方法。
但是还是让写程序,而且要考虑有obstacle的情况,就是考虑有的方格不能通过的情况
。这种情况好像不能用组合数直接算吧?

【在 P*******7 的大作中提到】
: 第二题很简单,不用dp,等价于m+n个数里面取m个数,答案是c(m+n, m)
P*******7
发帖数: 55
8
对于第二个问题,如果面试官就问了这一题,你花的时间就长了。因为这道题后面还有
一问,如果你保
持向下的步子一直多于或等于你向右的步子,一共多少种走法。

【在 f****9 的大作中提到】
: 我说用dp了。
: 感觉挺莫名其妙被拒的。第一个面试官问完了还说it‘s good,第二个面试官连计算组
: 合数的方法都不会。
: 可能是我听力不太好交流有点问题让他们印象是比较笨?还是我答题太慢了?莫非这种
: 难度的题45分钟应该完成多个,每个都在白板上完成code,才算合格了?

P*******7
发帖数: 55
9
这道题不是google经典题目么?面试者怎么会不知道组合数方法呢...那你太冤了

【在 f****9 的大作中提到】
: 我说了,面试官还没见过用组合数的方法。
: 但是还是让写程序,而且要考虑有obstacle的情况,就是考虑有的方格不能通过的情况
: 。这种情况好像不能用组合数直接算吧?

s********y
发帖数: 161
10
第一题,pass一遍找到有多少t,从第一个t开始顺着写非t数,最后填t。
还有什么更好的解法么。
相关主题
一道不错的算法题Google电话面试题目
leetcode jump game2a question about combination
这题怎么做?一道老题
进入JobHunting版参与讨论
j*****u
发帖数: 1133
11
第一遍就可以把非t前移,然后从最后一个位置把t填上

【在 s********y 的大作中提到】
: 第一题,pass一遍找到有多少t,从第一个t开始顺着写非t数,最后填t。
: 还有什么更好的解法么。

j*****u
发帖数: 1133
12
c# implementation,还有没有更好方法?
static void ArrayShift(T[] array, T seed) where T:IComparable
{
if (array == null)
throw new ArgumentNullException("array");
int dest = 0;
for (int i = 0; i < array.Length; ++i)
{
if (i != dest && !array[i].Equals(seed))
{
array[dest++] = array[i];
}
}
for (int i = dest; i < array.Length; ++i)
{
array[i] = seed;
}
}

【在 j*****u 的大作中提到】
: 第一遍就可以把非t前移,然后从最后一个位置把t填上
r*******g
发帖数: 43
13
我google第二题,竟然在“小学生VBS竞赛题库“里有。提示是杨辉三角算法或者回溯
法。这个回溯法应该就是DP, 杨辉三角是个什么?
d**e
发帖数: 6098
14
你的方法是对的,但code是不是写错了点?
1, 2, 3, 4, 5, 6, 7, 8
seed = 5
但由于dest一直等于0,所以6不幸被换到去1的位置了.

【在 j*****u 的大作中提到】
: c# implementation,还有没有更好方法?
: static void ArrayShift(T[] array, T seed) where T:IComparable
: {
: if (array == null)
: throw new ArgumentNullException("array");
: int dest = 0;
: for (int i = 0; i < array.Length; ++i)
: {
: if (i != dest && !array[i].Equals(seed))
: {

c***2
发帖数: 838
15
Original Array: 22 22 55 55 55 55 55 33 33 33
num=22:freq=2
num=55:freq=5
num=33:freq=3
Rotate 2:
55 55 55 55 55 33 33 33 22 22
Moved 44 to back:
0 moved:
55 55 55 55 55 33 33 33 22 22
Moved 33 to back:
3 moved:
55 55 55 55 55 22 22 33 33 33
c***2
发帖数: 838
16
int move_num_to_array_end(int array[], int size, int num)
{
int i=0,j,from;
int count=0;
int total=0;
int tail=size;
while(i count=0;
from=i;
while((array[i]==num)&&(i if (i>=tail-1) return total;

if (count) {
for(j=i;j array[j-count]=array[j];
tail -= count;

for(j=tail;j array[j]=num;

i=from;
}
else
i++;
}

return total;
}
f*******r
发帖数: 180
17
请问这样做可以么?
// 从一个array里找出等于t的数, 把它们放到array后面, 其他元素相对位置保持不变
, 顺次迁移.
void move_num_to_array_end(int array[], int size, int t) {
int idx = 0;
for (int i = 0; i < size; i++) {
int curInt = array[i];
if (curInt != t) {
array[idx] = array[i];
idx++;
}
}
for (;idx < size; idx++)
array[idx] = t;
}
// 一个m x n的方格, 从左上角到右下角走, 只能向右或向下, 总共几种走法.
int move_topleft_to_bottomright(int m, int n) {
if (m == 1 || n == 1)
return 1;
return (move_topleft_to_bottomright(m-1,n)+move_topleft_to_bottomright(m
,n-1));
}
c***2
发帖数: 838
18
very good. Much cleaner than mine.

【在 f*******r 的大作中提到】
: 请问这样做可以么?
: // 从一个array里找出等于t的数, 把它们放到array后面, 其他元素相对位置保持不变
: , 顺次迁移.
: void move_num_to_array_end(int array[], int size, int t) {
: int idx = 0;
: for (int i = 0; i < size; i++) {
: int curInt = array[i];
: if (curInt != t) {
: array[idx] = array[i];
: idx++;

g*********6
发帖数: 1149
19
第2题如果编程做,都不难。
如果用组合做,答案是等价于m+n-2个数里面取m-1个数,答案是c(m+n-2, m-1).因为总
共要走m+n-2,要在里面选m-1步向下走,或选n-1步向右走。
如果向下的步数不能超过向右的步数,该怎么算?

【在 P*******7 的大作中提到】
: 第二题很简单,不用dp,等价于m+n个数里面取m个数,答案是c(m+n, m)
f*******r
发帖数: 180
20
我觉得应该是c(m+n-2, n-1) 或者 c(m+n-2, m-1).

【在 P*******7 的大作中提到】
: 第二题很简单,不用dp,等价于m+n个数里面取m个数,答案是c(m+n, m)
相关主题
也问一个算法题careercup上这道题我竟然没看懂
问个面试题find median for k sorted arrays
问一道brainteaser题都感觉做对了,面试的人也满意,为什么二面过后还是直接悲剧呢……顺便上P面经
进入JobHunting版参与讨论
g*********s
发帖数: 1782
21
如果有方格不能通过的情况,确实会比较麻烦。不过还是组合问题。

【在 f****9 的大作中提到】
: 我说了,面试官还没见过用组合数的方法。
: 但是还是让写程序,而且要考虑有obstacle的情况,就是考虑有的方格不能通过的情况
: 。这种情况好像不能用组合数直接算吧?

g*********s
发帖数: 1782
22
还有优化的余地。如果数组里全是t,那第二个循环没必要了。不过不影响复杂度。

【在 f*******r 的大作中提到】
: 请问这样做可以么?
: // 从一个array里找出等于t的数, 把它们放到array后面, 其他元素相对位置保持不变
: , 顺次迁移.
: void move_num_to_array_end(int array[], int size, int t) {
: int idx = 0;
: for (int i = 0; i < size; i++) {
: int curInt = array[i];
: if (curInt != t) {
: array[idx] = array[i];
: idx++;

l****i
发帖数: 396
23
这两个是等价的把

【在 f*******r 的大作中提到】
: 我觉得应该是c(m+n-2, n-1) 或者 c(m+n-2, m-1).
x******3
发帖数: 245
24
用类似quick sort里得partition, 只要一次遍历数组就可以了, 但是需要3个指针

【在 g*********s 的大作中提到】
: 还有优化的余地。如果数组里全是t,那第二个循环没必要了。不过不影响复杂度。
f*******r
发帖数: 180
25
sorry, cannot type Chinese in the lab.....
I think a easy fix would be #ofways(topleft->bottomright) - #ofways(topleft-
>blockA)*#ofways(blockA->bottomright) if you only face one blockA.
But it's more complicated when you face more than one blocks.

【在 g*********s 的大作中提到】
: 如果有方格不能通过的情况,确实会比较麻烦。不过还是组合问题。
e**********6
发帖数: 78
26
void mv_t_to_end(int *a, int size, int t){
int i=0,j=0,k=size;
while(j if(a[j]==t){
j++;
k--;
}
else
a[i++]=a[j++];
}
while(k a[k++]=t;
}
h**6
发帖数: 4160
27
如果格子不多,障碍不少,令f(i, j)为各格子通往右下角的走法数,则:
f(n-1, m-1) = 1
f(i, j) = f(i+1, j) + f(i, j+1), if a[i][j]==1
f(i, j) = 0, if a[i][j]==0
f(0, 0)就是所求答案
如果格子不少,障碍不多,那么可以用包含与排除解决。
i**********e
发帖数: 1145
28
这个解法不对,有 bug.
test case:
{22,11,33,33,44,22,11}
t = 22,
output=
{11 33 33 44 44 22 22}
expected=
{11 33 33 44 11 22 22}
第一题的解:
void shiftArrayEqualsTBack(int num[], int n, int t) {
int total = 0;
for (int i = 0; i < n; i++) {
if (num[i] == t)
total++;
else
num[i-total] = num[i];
}
for (int i = n-total; i < n; i++) {
num[i] = t;
}
}
第二题的解:
const int X_MAX = 4;
const int Y_MAX = 4;
bool validLocation(int x, int y) {
if (x <= -1 || x >= X_MAX || y <= -1 || y >= Y_MAX) return false;
return true;
}
bool canReach(int map[][Y_MAX], int x, int y, bool visited[][Y_MAX]) {
if (!validLocation(x, y)) return false;
if (map[x][y]) return false;
if (x == X_MAX-1 && y == Y_MAX-1) return true;
if (visited[x][y]) return false;
visited[x][y] = true;

return canReach(map, x, y-1, visited) ||
canReach(map, x+1, y, visited) ||
canReach(map, x, y+1, visited) ||
canReach(map, x-1, y, visited);
}
int main() {
int map[X_MAX][Y_MAX] = {
{0,0,1,0},
{1,0,1,0},
{0,1,0,1},
{0,1,0,0}
};
bool visited[X_MAX][Y_MAX] = {false};
cout << canReach(map, 0, 0, visited);
return 0;
}
一些常见面试题的答案与总结 -
http://www.ihas1337code.com

【在 e**********6 的大作中提到】
: void mv_t_to_end(int *a, int size, int t){
: int i=0,j=0,k=size;
: while(j: if(a[j]==t){
: j++;
: k--;
: }
: else
: a[i++]=a[j++];
: }

1 (共1页)
进入JobHunting版参与讨论
相关主题
find median for k sorted arrays再论 mini # of swaps to sort array.
题都感觉做对了,面试的人也满意,为什么二面过后还是直接悲剧呢……顺便上P面经一道不错的算法题
一道面试碰到的概率题leetcode jump game2
算法题:两列找共同元素有O(n)的算法吗?这题怎么做?
请教一个老算法题, k-th largest sumGoogle电话面试题目
求这道题的O(N)解 (转载)a question about combination
details 2nd smallest element in an array一道老题
请教一个题: Median of Two Sorted Arrays也问一个算法题
相关话题的讨论汇总
话题: int话题: array话题: max话题: num话题: 33