由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 比较久之前T家的面试
相关主题
offer报告 (附带找工作感言)请教一道题
[面试题] 如何打印一个二叉树level by level?一道google电面题,估计挂了。。。
检查graph里面是否有circle,是用BFS,还是DFS?有没有人讲讲图论里的BFS & DFS算法及应用?
rejected by facebook after 2nd phone interview攒人品,google电话面经
问一道少见的微软面试题。Bloomberg on-campus interview (failed) 求教
问一道字符串相关的题目。请教一道面试题,判断迷宫有没有解
面试问题请教:如何在字典中得到最长的复合词MS onsite 面经
DFS vs. BFS in Web CrawlingAmazon电面经
相关话题的讨论汇总
话题: int话题: ncur话题: nmaxstep话题: flg话题: rec
进入JobHunting版参与讨论
1 (共1页)
G********r
发帖数: 9
1
比较久之前T家的面试,结果就不共享了,只贡献题目,可能给面Machine Learning方向
的有些帮助。
电面1.
(1)一些统计的问题,二项分布,大数定理,抛硬币做概率转换
(2) (写程序)用stack实现queue
电面2.
(1) Trending tweats的算法设计;tweat topic的提取;
(2)(写程序)输入一个程序源文件,写一个程序去掉所以有的comment
Onsite:
(1). (a)(写程序)两个字符串的最大公共字串
(b (puzzle)game: the interviewee is an oracle of a function "bool f(
int, int, int)", that is, the interviewer can provide three numbers as input
, then the interviewee can give the TRUE/FALSE answer. Play the game and
find the precise definition for the function.
(2). (a) some fundamental concept for machine learning (precision, recall,
ROC curve)
(b)(写程序)爬楼梯的题,valid single-step move is 2^k (always starting
from the first floor). Given a target floor n, output the best strategy to
reach it.
(3). (a) some system design question regarding news feed
(b)(写程序)reservoir sampling
(4). (a) (写程序)coding multiplication of 2 matrix
(b) (写程序)coding multiplication of a list of matrix
(5). (讨论)new feature to Twitter; trending design (again), some related
statistical model; linear regression 101; recursively use 1-feature linear
regression and the complexity discussion.
(6). (讨论)Machine Learning feature engineering for Twitter Ads; formula
and implementation of boost tree machine learning method; how to use
parallel computing to speed up training process; some discussion on
convergence speed.
c********t
发帖数: 5706
2
赞!多谢分享!
Onsite:
(1). (a)(写程序)两个字符串的最大公共字串
需要优化的算法吗?还是brute force就可以?
(b (puzzle)game: the interviewee is an oracle of a function "bool f(
int, int, int)", that is, the interviewer can provide three numbers as input
, then the interviewee can give the TRUE/FALSE answer. Play the game and
find the precise definition for the function.
不会做啊,试很多很多triple,然后找规律?
(b)(写程序)爬楼梯的题,valid single-step move is 2^k (always starting
from the first floor). Given a target floor n, output the best strategy to
reach it.
是用二进制,算吗?比如 5=101= 2^0+2^2
z***e
发帖数: 209
3
Mark一下.赞rp.
d*****y
发帖数: 1365
4
爬楼梯: 比如23楼,你可以先到8楼,再到7楼,再到23楼,只要三次,用二进制表示的话要4
次.

f(
input

【在 c********t 的大作中提到】
: 赞!多谢分享!
: Onsite:
: (1). (a)(写程序)两个字符串的最大公共字串
: 需要优化的算法吗?还是brute force就可以?
: (b (puzzle)game: the interviewee is an oracle of a function "bool f(
: int, int, int)", that is, the interviewer can provide three numbers as input
: , then the interviewee can give the TRUE/FALSE answer. Play the game and
: find the precise definition for the function.
: 不会做啊,试很多很多triple,然后找规律?
: (b)(写程序)爬楼梯的题,valid single-step move is 2^k (always starting

c********t
发帖数: 5706
5
哦,原来如此. 我做做试试。

要4

【在 d*****y 的大作中提到】
: 爬楼梯: 比如23楼,你可以先到8楼,再到7楼,再到23楼,只要三次,用二进制表示的话要4
: 次.
:
: f(
: input

c********t
发帖数: 5706
6
先弄了个recursion的,DP应该效率更好。
public int step(int n) {
if (n < 1)
return 0;
if (isPow(n))
return 1;
int count = 0, m=n;
while (m > 0) {
m /= 2;
count++;
}
return Math.min(1 + step(n - (int) Math.pow(2, count - 1)),
1 + step((int) Math.pow(2, count) - n));
}
boolean isPow(int n) {
while (n % 2 == 0)
n /= 2;
return n == 1;
}

要4

【在 d*****y 的大作中提到】
: 爬楼梯: 比如23楼,你可以先到8楼,再到7楼,再到23楼,只要三次,用二进制表示的话要4
: 次.
:
: f(
: input

d*****y
发帖数: 1365
7
我觉得这题应该用BFS

)-

【在 c********t 的大作中提到】
: 先弄了个recursion的,DP应该效率更好。
: public int step(int n) {
: if (n < 1)
: return 0;
: if (isPow(n))
: return 1;
: int count = 0, m=n;
: while (m > 0) {
: m /= 2;
: count++;

c********t
发帖数: 5706
8
下楼呢?可以往右或往上走?

【在 d*****y 的大作中提到】
: 我觉得这题应该用BFS
:
: )-

d*****y
发帖数: 1365
9
我说错了,其实BFS就行了.如果a = b + 2^k or a = b-2^k,这两点之间有一个edge,按
照这个关系可以建一个graph
其实还要考虑这个target是不是在最顶楼,如果不在最顶楼,还有可能爬到顶楼再爬下来.

【在 c********t 的大作中提到】
: 下楼呢?可以往右或往上走?
c********t
发帖数: 5706
10
你写一个BFS的吧。我用DFS做的。
还有顶楼条件啊,就当无限高吧。

来.

【在 d*****y 的大作中提到】
: 我说错了,其实BFS就行了.如果a = b + 2^k or a = b-2^k,这两点之间有一个edge,按
: 照这个关系可以建一个graph
: 其实还要考虑这个target是不是在最顶楼,如果不在最顶楼,还有可能爬到顶楼再爬下来.

相关主题
问一道字符串相关的题目。请教一道题
面试问题请教:如何在字典中得到最长的复合词一道google电面题,估计挂了。。。
DFS vs. BFS in Web Crawling有没有人讲讲图论里的BFS & DFS算法及应用?
进入JobHunting版参与讨论
G********r
发帖数: 9
11

brute force应该不行吧,我直接写了suffix tree的solution。
f(
input
是的,最后的解好像是如果a
【在 c********t 的大作中提到】
: 赞!多谢分享!
: Onsite:
: (1). (a)(写程序)两个字符串的最大公共字串
: 需要优化的算法吗?还是brute force就可以?
: (b (puzzle)game: the interviewee is an oracle of a function "bool f(
: int, int, int)", that is, the interviewer can provide three numbers as input
: , then the interviewee can give the TRUE/FALSE answer. Play the game and
: find the precise definition for the function.
: 不会做啊,试很多很多triple,然后找规律?
: (b)(写程序)爬楼梯的题,valid single-step move is 2^k (always starting

c********t
发帖数: 5706
12
好佩服能当场写suffix tree的,我猜你已经是Ter了。
function可以对 a b c,做各种运算,比较。a 出吧。

【在 G********r 的大作中提到】
:
: brute force应该不行吧,我直接写了suffix tree的solution。
: f(
: input
: 是的,最后的解好像是如果a
w****x
发帖数: 2483
13

这个对吗??

【在 c********t 的大作中提到】
: 先弄了个recursion的,DP应该效率更好。
: public int step(int n) {
: if (n < 1)
: return 0;
: if (isPow(n))
: return 1;
: int count = 0, m=n;
: while (m > 0) {
: m /= 2;
: count++;

w****x
发帖数: 2483
14

BFS??
这个不是搜索,是最短路径吧, dijikstra

【在 d*****y 的大作中提到】
: 我觉得这题应该用BFS
:
: )-

w****x
发帖数: 2483
15
vector getJumpSteps(int nCur, int nMaxStep)
{
vector vec;
if (nCur <= 0 || nMaxStep < nCur)
return vec;
int flg = 1;
while (nCur + flg <= nMaxStep)
{
vec.push_back(nCur + flg);
flg = (flg << 1);
}
flg = 1;
while (nCur - flg > 0)
{
vec.push_back(nCur - flg);
flg = (flg << 1);
}
return vec;
}
int getMinStep(int n, int nMaxStep)
{
if (n <= 0 || nMaxStep < n)
return -1;
int* rec = new int[nMaxStep+1];
for (int i = 0; i <= nMaxStep; i++)
rec[i] = -1;
queue que;
que.push(1);
rec[1] = 0;
while (!que.empty())
{
int nCur = que.front();
que.pop();
vector vec = getJumpSteps(nCur, nMaxStep);
for (int i = 0; i < vec.size(); i++)
{
int des = vec[i];
if (rec[des] < 0 || rec[des] > rec[nCur] + 1)
{
rec[des] = rec[nCur] + 1;
que.push(des);
}
}
}
int nRet = rec[n];
delete[] rec;
return nRet;
}
p*****2
发帖数: 21240
16

大牛咋还没转java呢?

【在 w****x 的大作中提到】
: vector getJumpSteps(int nCur, int nMaxStep)
: {
: vector vec;
: if (nCur <= 0 || nMaxStep < nCur)
: return vec;
: int flg = 1;
: while (nCur + flg <= nMaxStep)
: {
: vec.push_back(nCur + flg);
: flg = (flg << 1);

w****x
发帖数: 2483
17

工程是VC的

【在 p*****2 的大作中提到】
:
: 大牛咋还没转java呢?

p*****2
发帖数: 21240
18

你这是做的第几题?

【在 w****x 的大作中提到】
:
: 工程是VC的

w****x
发帖数: 2483
19

第213题

【在 p*****2 的大作中提到】
:
: 你这是做的第几题?

p*****2
发帖数: 21240
20

我是说上边第几题?我想看看。

【在 w****x 的大作中提到】
:
: 第213题

相关主题
攒人品,google电话面经MS onsite 面经
Bloomberg on-campus interview (failed) 求教Amazon电面经
请教一道面试题,判断迷宫有没有解fb电话面试
进入JobHunting版参与讨论
w****x
发帖数: 2483
21

爬楼梯那题,这题出的很有水平!

【在 p*****2 的大作中提到】
:
: 我是说上边第几题?我想看看。

p*****2
发帖数: 21240
22

这题DP不行吗?

【在 c********t 的大作中提到】
: 好佩服能当场写suffix tree的,我猜你已经是Ter了。
: function可以对 a b c,做各种运算,比较。a: 出吧。

w****x
发帖数: 2483
23

dijkstra就算DP啊

【在 p*****2 的大作中提到】
:
: 这题DP不行吗?

p*****2
发帖数: 21240
24

就是BFS吧。扫到0就可以了。

【在 w****x 的大作中提到】
:
: dijkstra就算DP啊

p*****2
发帖数: 21240
25

我说的suffix tree那题。

【在 w****x 的大作中提到】
:
: dijkstra就算DP啊

p*****2
发帖数: 21240
26

来.
就是BFS

【在 d*****y 的大作中提到】
: 我说错了,其实BFS就行了.如果a = b + 2^k or a = b-2^k,这两点之间有一个edge,按
: 照这个关系可以建一个graph
: 其实还要考虑这个target是不是在最顶楼,如果不在最顶楼,还有可能爬到顶楼再爬下来.

d**********x
发帖数: 4083
27
我感觉还是用二进制。但是是把n拆成a - b的形式
首先要证明的是,不需要有两次重复的相同的k,因为可以用一次k+1替换,然后类推。
然后我们要得到的是a和b中的"1"尽量少。我的想法是,对于a中每串连续的、超过1位
的1,将其换成10..00 - 1的形式。
这样,对于23 = 10111 = 11000 - 1 = 100000 - 1001,是三次
但是要考虑转化后再成为连续的1的问题,举例:
110111 = 111000 - 1 = 1000000 - 1001
110111 = 1001000 - 10001,是多了一次的
所以需要从低位开始处理,逐串转化。
大家帮我看看这个想法有没有问题吧。

要4
bool

【在 d*****y 的大作中提到】
: 爬楼梯: 比如23楼,你可以先到8楼,再到7楼,再到23楼,只要三次,用二进制表示的话要4
: 次.
:
: f(
: input

p*****2
发帖数: 21240
28
def solve(n:Int):Int={
val isPow=(n:Int)=>{var m=n;while(m%2==0) m/=2;m==1}
val visited=new Array[Boolean](n+1)
val queue=new Queue[Int]
queue+=n
visited(n)=true
var count=1
var distance=0

while(!queue.isEmpty){
while(count>0){
val curr=queue.dequeue
if(curr==0) return distance
for(i<-0 until n if !visited(i) && isPow((curr-i).abs)){
queue+=i
visited(i)=true
}
count-=1
}
count=queue.length
distance+=1
}
-1
}
a***o
发帖数: 1182
29
二爷介绍一下算法?
DFS不行吗?

【在 p*****2 的大作中提到】
: def solve(n:Int):Int={
: val isPow=(n:Int)=>{var m=n;while(m%2==0) m/=2;m==1}
: val visited=new Array[Boolean](n+1)
: val queue=new Queue[Int]
: queue+=n
: visited(n)=true
: var count=1
: var distance=0
:
: while(!queue.isEmpty){

p*****2
发帖数: 21240
30

DFS也可以。不过效率没有BFS高而已。

【在 a***o 的大作中提到】
: 二爷介绍一下算法?
: DFS不行吗?

相关主题
亚麻新鲜面经[面试题] 如何打印一个二叉树level by level?
Google及其它面经 (长,慎入)检查graph里面是否有circle,是用BFS,还是DFS?
offer报告 (附带找工作感言)rejected by facebook after 2nd phone interview
进入JobHunting版参与讨论
d**********x
发帖数: 4083
31
应该没问题,和coldknight的程序在2-10000之内做了对比,结果完全一致。他的
nMaxStep我设置为了2 * target,不知道会不会引起问题。
在纸面上也做了不太严格的证明。。这样复杂度就是O(logn)。
对比程序:(前半部分还是coldknight的)
#include
#include
#include
using namespace std;
vector getJumpSteps(int nCur, int nMaxStep)
{
vector vec;
if (nCur <= 0 || nMaxStep < nCur)
return vec;
int flg = 1;
while (nCur + flg <= nMaxStep)
{
vec.push_back(nCur + flg);
flg = (flg << 1);
}
flg = 1;
while (nCur - flg > 0)
{
vec.push_back(nCur - flg);
flg = (flg << 1);
}
return vec;
}
int getMinStep(int n, int nMaxStep)
{
if (n <= 0 || nMaxStep < n)
return -1;
int* rec = new int[nMaxStep+1];
for (int i = 0; i <= nMaxStep; i++)
rec[i] = -1;
queue que;
que.push(1);
rec[1] = 0;
while (!que.empty())
{
int nCur = que.front();
que.pop();
vector vec = getJumpSteps(nCur, nMaxStep);
for (int i = 0; i < vec.size(); i++)
{
int des = vec[i];
if (rec[des] < 0 || rec[des] > rec[nCur] + 1)
{
rec[des] = rec[nCur] + 1;
que.push(des);
}
}
}
int nRet = rec[n];
delete[] rec;
return nRet;
}
int getMinSteps(int target) {
if (target <= 0) {
return -1;
}
target--;
int steps = 0;
int cont_ones = 0;
while(target > 0) {
int lsb = target & 1;
target >>= 1;
if (lsb == 0) {
if (cont_ones <= 1) {
steps += cont_ones;
cont_ones = 0;
} else {
steps += 1;
cont_ones = 1;
}

} else {
cont_ones++;
}
}
if (cont_ones > 1) {
steps += 2;
} else {
steps += cont_ones;
}
return steps;
}
int main() {
int same = 0;
int diff = 0;
for (int i = 2; i < 10000; ++i) {
if (getMinStep(i, i * 2) == getMinSteps(i)) {
same++;
} else {
diff++;
cout << "diff: " << i << endl;
}
}
cout << "same: " << same << " diff: " << diff << endl;
return 0;
}

【在 d**********x 的大作中提到】
: 我感觉还是用二进制。但是是把n拆成a - b的形式
: 首先要证明的是,不需要有两次重复的相同的k,因为可以用一次k+1替换,然后类推。
: 然后我们要得到的是a和b中的"1"尽量少。我的想法是,对于a中每串连续的、超过1位
: 的1,将其换成10..00 - 1的形式。
: 这样,对于23 = 10111 = 11000 - 1 = 100000 - 1001,是三次
: 但是要考虑转化后再成为连续的1的问题,举例:
: 110111 = 111000 - 1 = 1000000 - 1001
: 110111 = 1001000 - 10001,是多了一次的
: 所以需要从低位开始处理,逐串转化。
: 大家帮我看看这个想法有没有问题吧。

w****x
发帖数: 2483
32

哪家快一些?

【在 d**********x 的大作中提到】
: 应该没问题,和coldknight的程序在2-10000之内做了对比,结果完全一致。他的
: nMaxStep我设置为了2 * target,不知道会不会引起问题。
: 在纸面上也做了不太严格的证明。。这样复杂度就是O(logn)。
: 对比程序:(前半部分还是coldknight的)
: #include
: #include
: #include
: using namespace std;
: vector getJumpSteps(int nCur, int nMaxStep)
: {

d**********x
发帖数: 4083
33
你猜。。
我只要扫描一遍数字的binary表示。

【在 w****x 的大作中提到】
:
: 哪家快一些?

a***o
发帖数: 1182
34
如果没给nMaxStep, BFS就做不了了吧?
怎么证明nMaxStep <= 2*target?

【在 d**********x 的大作中提到】
: 应该没问题,和coldknight的程序在2-10000之内做了对比,结果完全一致。他的
: nMaxStep我设置为了2 * target,不知道会不会引起问题。
: 在纸面上也做了不太严格的证明。。这样复杂度就是O(logn)。
: 对比程序:(前半部分还是coldknight的)
: #include
: #include
: #include
: using namespace std;
: vector getJumpSteps(int nCur, int nMaxStep)
: {

d**********x
发帖数: 4083
35
我是从我那个算法的角度考虑得到的2*target。。。
严格证明还是挺头疼的,我再想想。

【在 a***o 的大作中提到】
: 如果没给nMaxStep, BFS就做不了了吧?
: 怎么证明nMaxStep <= 2*target?

a***o
发帖数: 1182
36
恩,扫一遍那个比较好理解

【在 d**********x 的大作中提到】
: 我是从我那个算法的角度考虑得到的2*target。。。
: 严格证明还是挺头疼的,我再想想。

c***s
发帖数: 192
37
我觉得是对的,有一个Non-adjacent form(NAF)的东西就是这个题目的答案。
http://en.wikipedia.org/wiki/Non-adjacent_form#cite_ref-gecc_1-
所以这个题的复杂度O(logN).

【在 d**********x 的大作中提到】
: 我感觉还是用二进制。但是是把n拆成a - b的形式
: 首先要证明的是,不需要有两次重复的相同的k,因为可以用一次k+1替换,然后类推。
: 然后我们要得到的是a和b中的"1"尽量少。我的想法是,对于a中每串连续的、超过1位
: 的1,将其换成10..00 - 1的形式。
: 这样,对于23 = 10111 = 11000 - 1 = 100000 - 1001,是三次
: 但是要考虑转化后再成为连续的1的问题,举例:
: 110111 = 111000 - 1 = 1000000 - 1001
: 110111 = 1001000 - 10001,是多了一次的
: 所以需要从低位开始处理,逐串转化。
: 大家帮我看看这个想法有没有问题吧。

d**********x
发帖数: 4083
38
Orz...

【在 c***s 的大作中提到】
: 我觉得是对的,有一个Non-adjacent form(NAF)的东西就是这个题目的答案。
: http://en.wikipedia.org/wiki/Non-adjacent_form#cite_ref-gecc_1-
: 所以这个题的复杂度O(logN).

w****x
发帖数: 2483
39

我靠,这个思路太强了,大牛以前做竞赛的?

【在 d**********x 的大作中提到】
: 我感觉还是用二进制。但是是把n拆成a - b的形式
: 首先要证明的是,不需要有两次重复的相同的k,因为可以用一次k+1替换,然后类推。
: 然后我们要得到的是a和b中的"1"尽量少。我的想法是,对于a中每串连续的、超过1位
: 的1,将其换成10..00 - 1的形式。
: 这样,对于23 = 10111 = 11000 - 1 = 100000 - 1001,是三次
: 但是要考虑转化后再成为连续的1的问题,举例:
: 110111 = 111000 - 1 = 1000000 - 1001
: 110111 = 1001000 - 10001,是多了一次的
: 所以需要从低位开始处理,逐串转化。
: 大家帮我看看这个想法有没有问题吧。

p*****2
发帖数: 21240
40

他初中就玩电脑了,高中就竞赛了。世界级水平。

【在 w****x 的大作中提到】
:
: 我靠,这个思路太强了,大牛以前做竞赛的?

相关主题
rejected by facebook after 2nd phone interview面试问题请教:如何在字典中得到最长的复合词
问一道少见的微软面试题。DFS vs. BFS in Web Crawling
问一道字符串相关的题目。请教一道题
进入JobHunting版参与讨论
d**********x
发帖数: 4083
41
没搞过。。。思路跳跃了一下而已。。
经常会跳错。。。

【在 w****x 的大作中提到】
:
: 我靠,这个思路太强了,大牛以前做竞赛的?

f*****e
发帖数: 2992
42
我都想到了,关键是有没有严格的proof啊?

【在 w****x 的大作中提到】
:
: 我靠,这个思路太强了,大牛以前做竞赛的?

p*****2
发帖数: 21240
43

你也是大牛呀。

【在 f*****e 的大作中提到】
: 我都想到了,关键是有没有严格的proof啊?
d**********x
发帖数: 4083
44
看上面那位给出的NAF,再找找相关的定理之类,我觉得靠谱

【在 f*****e 的大作中提到】
: 我都想到了,关键是有没有严格的proof啊?
f*****e
发帖数: 2992
45
过奖了,我也是看了前面的讨论才想到的。

【在 p*****2 的大作中提到】
:
: 你也是大牛呀。

p*****2
发帖数: 21240
46

这样呀。我没看讨论,直接看题想到BFS

【在 f*****e 的大作中提到】
: 过奖了,我也是看了前面的讨论才想到的。
w****x
发帖数: 2483
47

丢人了,BFS都没想到

【在 p*****2 的大作中提到】
:
: 这样呀。我没看讨论,直接看题想到BFS

p*****2
发帖数: 21240
48

你是什么算法?dijstra吗?也差不多。

【在 w****x 的大作中提到】
:
: 丢人了,BFS都没想到

w****x
发帖数: 2483
49

哎呀,我基础太差了,dijkstra是在权重不一样的情况下用的,BFS就可以了,丢死人


【在 p*****2 的大作中提到】
:
: 你是什么算法?dijstra吗?也差不多。

p*****2
发帖数: 21240
50

是这样的。

【在 w****x 的大作中提到】
:
: 哎呀,我基础太差了,dijkstra是在权重不一样的情况下用的,BFS就可以了,丢死人
: 了

相关主题
一道google电面题,估计挂了。。。Bloomberg on-campus interview (failed) 求教
有没有人讲讲图论里的BFS & DFS算法及应用?请教一道面试题,判断迷宫有没有解
攒人品,google电话面经MS onsite 面经
进入JobHunting版参与讨论
c********t
发帖数: 5706
51
DP可以做(写程序)两个字符串的最大公共字串。我觉得比写suffix tree容易些。

【在 p*****2 的大作中提到】
:
: 是这样的。

h*******e
发帖数: 1377
52
suffix tree大概多少行啊,从来没写过。 suffix array有大约25行如果背还好背点


【在 c********t 的大作中提到】
: DP可以做(写程序)两个字符串的最大公共字串。我觉得比写suffix tree容易些。
p*****2
发帖数: 21240
53

感觉面试用DP更好。

【在 c********t 的大作中提到】
: DP可以做(写程序)两个字符串的最大公共字串。我觉得比写suffix tree容易些。
f*****e
发帖数: 2992
54
suffix tree能做出来吗?那个是连续的吧?

【在 c********t 的大作中提到】
: DP可以做(写程序)两个字符串的最大公共字串。我觉得比写suffix tree容易些。
d**********x
发帖数: 4083
55
恩,这是俩不同的问题。。

【在 f*****e 的大作中提到】
: suffix tree能做出来吗?那个是连续的吧?
c********t
发帖数: 5706
56
为什么BFS效率高?
我感觉我的DFS那个加了greedy. 如果能加上三个优化。
1.用bit方法做。 23= (10000+100+10+1) or (100000-1000-1)
2. 每次用binary search在bit上来找 k, 使得2^(k-1)< n <= 2^k。
3.还有isPow(n)这个函数有O(1)解法。
这样综合起来应该是最快解法。

【在 p*****2 的大作中提到】
:
: 感觉面试用DP更好。

f*********m
发帖数: 726
57
二哥能说说这个bfs的思路吗?

【在 p*****2 的大作中提到】
:
: 感觉面试用DP更好。

p*****2
发帖数: 21240
58

23楼是目标,我们认为distance是0
那么distance为1的是哪些?就是跟23的差是2的倍数的值,比如
23-22=1 Yes
23-21 =2 Yes
23-19 =4 Yes
把distance为1的放到queue里。
然后找distance为2的,找到0为止
我的算法只是demo,里边几个地方都需要优化的。但是基本这个意思。第一个0找到就
是最短路径。而一般dfs要找全才可以得出最短。上边dfs我还没看为什么更优。

【在 f*********m 的大作中提到】
: 二哥能说说这个bfs的思路吗?
a***o
发帖数: 1182
59
二爷如果不知道最高的层数的话,
假设是无限楼层,bfs是不是没法做了?
要证明不超过target*2?

【在 p*****2 的大作中提到】
:
: 23楼是目标,我们认为distance是0
: 那么distance为1的是哪些?就是跟23的差是2的倍数的值,比如
: 23-22=1 Yes
: 23-21 =2 Yes
: 23-19 =4 Yes
: 把distance为1的放到queue里。
: 然后找distance为2的,找到0为止
: 我的算法只是demo,里边几个地方都需要优化的。但是基本这个意思。第一个0找到就
: 是最短路径。而一般dfs要找全才可以得出最短。上边dfs我还没看为什么更优。

c********t
发帖数: 5706
60
你这个bfs有问题吧,
还应该考虑吧
24-23=1
25-23=2
27-23=4



看看楼上devilphonix的bfs吧

【在 p*****2 的大作中提到】
:
: 23楼是目标,我们认为distance是0
: 那么distance为1的是哪些?就是跟23的差是2的倍数的值,比如
: 23-22=1 Yes
: 23-21 =2 Yes
: 23-19 =4 Yes
: 把distance为1的放到queue里。
: 然后找distance为2的,找到0为止
: 我的算法只是demo,里边几个地方都需要优化的。但是基本这个意思。第一个0找到就
: 是最短路径。而一般dfs要找全才可以得出最短。上边dfs我还没看为什么更优。

相关主题
Amazon电面经Google及其它面经 (长,慎入)
fb电话面试offer报告 (附带找工作感言)
亚麻新鲜面经[面试题] 如何打印一个二叉树level by level?
进入JobHunting版参与讨论
S******0
发帖数: 71
61
改成BFS了
//each time can jump up or down 2^k steps, find fewest jumping step,
//always start from the first step
vector getJumpSteps(int nCur, int nMaxStep)
{
vector vec;
if (nCur <= 0 || nMaxStep < nCur)
return vec;
int flg = 1;
while (nCur + flg <= nMaxStep)
{
vec.push_back(nCur + flg);
flg = (flg << 1);
}
flg = 1;
while (nCur - flg > 0)
{
vec.push_back(nCur - flg);
flg = (flg << 1);
}
return vec;
}
int getMinStep(int n, int nMaxStep)
{
if (n <= 0 || nMaxStep < n)
return -1;
queue que;
que.push(1);
set rec;
int nCurNum = 1;
int nNextNum = 0;
int nCurLev = 0;
while (!que.empty())
{
int nCur = que.front();
rec.insert(nCur);
que.pop();
nCurNum--;
vector vec = getJumpSteps(nCur, nMaxStep);
for (int i = 0; i < vec.size(); i++)
{
if (vec[i] == n)
return nCurLev+1;
if (rec.find(vec[i]) == rec.end())
{
que.push(vec[i]);
nNextNum++;
}
}
if (nCurNum == 0)
{
nCurLev++;
nCurNum = nNextNum;
nNextNum = 0;
}
}
return -1;
}
p*****2
发帖数: 21240
62

无限楼层最差的话也是第一个2^n大于target的吧?不可能比这个大还更优吧?

【在 a***o 的大作中提到】
: 二爷如果不知道最高的层数的话,
: 假设是无限楼层,bfs是不是没法做了?
: 要证明不超过target*2?

p*****2
发帖数: 21240
63

无所谓吧。本来就是说个思路。

【在 c********t 的大作中提到】
: 你这个bfs有问题吧,
: 还应该考虑吧
: 24-23=1
: 25-23=2
: 27-23=4
: 。
: 。
: 。
: 看看楼上devilphonix的bfs吧

1 (共1页)
进入JobHunting版参与讨论
相关主题
Amazon电面经问一道少见的微软面试题。
fb电话面试问一道字符串相关的题目。
亚麻新鲜面经面试问题请教:如何在字典中得到最长的复合词
Google及其它面经 (长,慎入)DFS vs. BFS in Web Crawling
offer报告 (附带找工作感言)请教一道题
[面试题] 如何打印一个二叉树level by level?一道google电面题,估计挂了。。。
检查graph里面是否有circle,是用BFS,还是DFS?有没有人讲讲图论里的BFS & DFS算法及应用?
rejected by facebook after 2nd phone interview攒人品,google电话面经
相关话题的讨论汇总
话题: int话题: ncur话题: nmaxstep话题: flg话题: rec