Redian新闻
>
EAD approve之后多久能收到卡
avatar
EAD approve之后多久能收到卡# EB23 - 劳工卡
w*a
1
"10分钟前面经"系列的第三弹,这次是F家电二面。
不用大家Bless了,这次必挂了。就问了一道技术题。
Word breaking
// How many spaces can we add to a word such that:
// All subwords can be found within a given dictionary
// fireman
// fire man -> 2 words
// fir em an -> 3 words
/* DICT
a
an
em
fir
fire
ire
ma
man
*/
这题以前没做过,我当时想这个看上去就是个典型DP题。
但是没做过不敢妄为 就想先用回溯先做个解出来再跟他讨论DP。
然后回溯做法出了个bug被他指出来,然后卡壳了好一会。最后DP也没做成。面试时间
一共三十分钟左右。就因为卡了会壳估计面试官都没兴趣让我再用别的解法做了。。
而且中途还有个,我循环用i和j被他指出来了。我正常变量命名都还行,就是循环我一
直喜欢用i,以后连循环我都不敢用i了。大家吸取教训。
给大家个教训吧。没做过的题千万别慌。写出代码了自己一定要多用几个test测测,自
己发现了bug跟他发现了bug完全是两个数量级的悲剧。
Move on了,还有一家G,继续准备。
avatar
x*0
2
老板催的急。有谁share一下时间?多谢。
avatar
M*5
3
需要找出所有的组合还是只需要找出一个即可?
Bless G家面试。。。
avatar
y*0
4
1周左右。
avatar
f*x
5
bless G
avatar
f*x
6
现在从RD开始多久Approve

【在 y******0 的大作中提到】
: 1周左右。
avatar
w*a
7
找出substring最多的一组。
avatar
y*0
8
2-3个月。

【在 f*******x 的大作中提到】
: 现在从RD开始多久Approve
avatar
w*a
9
不需要枚举出来,给个数量就行。
avatar
y*0
10
2-3个月。

【在 f*******x 的大作中提到】
: 现在从RD开始多久Approve
avatar
w*x
11
DP经典题, 递归也可以吧
avatar
x*0
12
我的不到两个月就approve了。
avatar
w*a
13
刚看了用memoization做.
递归肯定可以,但是毕竟效率低。更重要的是我出BUG被指出来还卡壳了。。
avatar
j*p
14
我家的批了三个礼拜才收到卡,还是我做了SR的结果
avatar
a*8
15
bless G, 顺便mark题,
和 leetcode Substring with Concatenation of All Words有点像,
avatar
a*o
16
我昨晚收到approval notice, 为什么卡不是一起来的呢?
avatar
w*a
17
刚看了用memoization做.
递归肯定可以,但是毕竟效率低。更重要的是我出BUG被指出来还卡壳了。。
avatar
a*o
18
具体啥bug?

【在 w****a 的大作中提到】
: 刚看了用memoization做.
: 递归肯定可以,但是毕竟效率低。更重要的是我出BUG被指出来还卡壳了。。

avatar
w*a
19
刚看了用memoization做.
递归肯定可以,但是毕竟效率低。更重要的是我出BUG被指出来还卡壳了。。
avatar
a*o
20
看了一下楼主一面的很牛啊,为啥f家还要二面呢?
我记得面得好,一面就行了呀,还是记错了?

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
d*y
21
int numofword(string& S)
{
unordered_set dict;
dict.insert(string("a"));
dict.insert(string("an"));
dict.insert(string("em"));
dict.insert(string("fir"));
dict.insert(string("fire"));
dict.insert(string("ire"));
dict.insert(string("ma"));
dict.insert(string("man"));
vector vNumW(S.size()+1,-1);
vNumW[0]=0;
for(int i=1;i<=S.size();++i){
for(int j=i-1;j>=0;--j){
if(dict.count(S.substr(j,i-j)))
vNumW[i] = max(vNumW[i],vNumW[j]+1);
}
}
return vNumW[S.size()];
}
为什么循环的时候不能用i,j?

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
w*a
22
面试官感觉变量命名不好。

【在 d*****y 的大作中提到】
: int numofword(string& S)
: {
: unordered_set dict;
: dict.insert(string("a"));
: dict.insert(string("an"));
: dict.insert(string("em"));
: dict.insert(string("fir"));
: dict.insert(string("fire"));
: dict.insert(string("ire"));
: dict.insert(string("ma"));

avatar
M*5
23
int combCount(std::string& str, std::set& dict){
if( str.length()==0 )
return 1;

int count = 0;
for(int i=1; i<=str.length(); i++){
std::string first = str.substr(0,i);
if( i==str.length() ){
if( dict.find(first)==dict.end() )
return -1;
else
return 1;
}
if( dict.find(sub)!=dict.end() ){
std::string remaining = str.substr(i);
int sub_count = combCount(remaining, dict);
if( sub_count!=-1 )
count += sub_count;
}
}

if(count==0)
return -1;
return count;
}
这样写行不行?
avatar
d*e
24
def break_words(line, sol, result):
if not line:
result.append(sol[:])
else:
for i in xrange(len(line)):
if in_dict(line[:i+1]):
sol.append(line[:i+1])
break_words(line[i+1:], sol, result)
sol.pop()

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
H*s
25
循环用 i 为啥不可以啊? 几乎所有人都这样写啊。

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
j*y
26
bless
是要返回最少的 所需的space 还是返回最多的单词数?
我这个是返回最少的所需的 space
int numberSpaceNeed(string s, unordered_set & dict)
{
int n = s.length();
int dp[n][n];
for(int i = 0; i < n ; ++i)
{
if(dict.find(s.substr(i, 1) != dict.end()))
{
dp[i][i] = 0;
}
else
{
dp[i][i] = n;
}
}
for(int k = 2; k <= n; ++k) // k is the length of substr
for(int i = 0; i <= n - k; ++i)
{
dp[i][i + k - 1] = n;
if(dict.find(s.substr(i, k) != dict.end()))
{
dp[i][i + k - 1] = 0;
continue;
}
for(int j = i + 1; j < i + k - 1; ++j)
{
dp[i][i + k - 1] = min(dp[i][i + k - 1], dp[
i][j] + dp[j + 1][i + k - 1] + 1);
}
}
return dp[0][n - 1];
}

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
w*x
27

为什么用二维数组?

【在 j*****y 的大作中提到】
: bless
: 是要返回最少的 所需的space 还是返回最多的单词数?
: 我这个是返回最少的所需的 space
: int numberSpaceNeed(string s, unordered_set & dict)
: {
: int n = s.length();
: int dp[n][n];
: for(int i = 0; i < n ; ++i)
: {
: if(dict.find(s.substr(i, 1) != dict.end()))

avatar
j*y
28
dp 阿, dp[i][j] 表示 break s[i,...,j] 所需的 space

【在 w****x 的大作中提到】
:
: 为什么用二维数组?

avatar
l*h
29
求dp的状态方程怎么写?
avatar
s*s
30
lz加油!我猜如果f还像去年一样大招人的话,你还是有机会的!
avatar
S*0
31

不对吧

【在 j*****y 的大作中提到】
: dp 阿, dp[i][j] 表示 break s[i,...,j] 所需的 space
avatar
j*y
32
这个问题是求需要插入的最少的 space的数目吗?

【在 S******0 的大作中提到】
:
: 不对吧

avatar
l*b
33
先bless,再看!
avatar
l*8
34
我也觉得用一维数组就够了。

【在 j*****y 的大作中提到】
: dp 阿, dp[i][j] 表示 break s[i,...,j] 所需的 space
avatar
M*5
35
我求的是所有可能的space组合。。。

【在 j*****y 的大作中提到】
: 这个问题是求需要插入的最少的 space的数目吗?
avatar
j*y
36
我的理解是 如果用一维数组的话
dp[i] 表示 break s[0,...,i] 所需的 space 是吧?

【在 l*********8 的大作中提到】
: 我也觉得用一维数组就够了。
avatar
j*y
37
应该不是所有 space的组合

【在 M********5 的大作中提到】
: 我求的是所有可能的space组合。。。
avatar
j*y
38
也不好说 :)

应该不是所有 space的组合

【在 j*****y 的大作中提到】
: 应该不是所有 space的组合
avatar
w*x
39

一维数组

【在 j*****y 的大作中提到】
: 也不好说 :)
:
: 应该不是所有 space的组合

avatar
l*8
40
是的

【在 j*****y 的大作中提到】
: 我的理解是 如果用一维数组的话
: dp[i] 表示 break s[0,...,i] 所需的 space 是吧?

avatar
j*y
41
想了一下,一维数组确实够了 :)
int numberSpaceNeed(string s, unordered_set & dict)
{
int n = s.length();
int dp[n];
if(dict.find(s.substr(0, 1)) != dict.end())
{
dp[0] = 0;
}
else
{
dp[0] = n;
}
for(int i = 1; i < n; ++i)
{
if(dict.find(s.substr(0, i + 1)) != dict.end())
{
dp[i] = 0;
}
else
{
dp[i] = n;
for(int j = 0; j < i; ++j)
{
if(dict.find(s.substr(j + 1, i - j)) != dict
.end())
{
dp[i] = min(dp[i], dp[j] + 1);
}
}
}
}
return dp[n - 1];
}

【在 l*********8 的大作中提到】
: 我也觉得用一维数组就够了。
avatar
l*8
42
dp[i] = min(dp[i], dp[j] + 1);
为什么用min?

【在 j*****y 的大作中提到】
: 想了一下,一维数组确实够了 :)
: int numberSpaceNeed(string s, unordered_set & dict)
: {
: int n = s.length();
: int dp[n];
: if(dict.find(s.substr(0, 1)) != dict.end())
: {
: dp[0] = 0;
: }
: else

avatar
w*a
43
感谢楼上的bless
我是根本没想到电面就开始考DP题,DP题我做了不超过10题。所以拿道题我也没敢用DP
做。怕写错,就用递归做了。给你们看看我做的吧。最后代码没啥问题,我刚刚跑了几
个测试都过了。
void maxSubwords(int subs, string& str, map& dict,int id, int &
maxNumber){
if(id == str.size()){
maxNumber = max(subs,maxNumber);
return;
}
for(int subStrBegin = id; subStrBegin < str.size(); subStrBegin ++){
bool canContinue = false;
for(int subStrEnd = subStrBegin ; subStrEnd < str.size(); subStrEnd
++){
string substring = str.substr(subStrBegin ,subStrEnd-subStrBegin
+1);
if(subStrEnd maxSubwords(subs+1,str,dict,subStrEnd+1,maxNumber);
canContinue = true;
}
}
if(!canContinue) break;
}
}
avatar
f*e
44
facebook肯定看复杂度的,recursive效率太低,burtal force应该不难吧。
不过这题有比较经典的O(N)算法。

DP

【在 w****a 的大作中提到】
: 感谢楼上的bless
: 我是根本没想到电面就开始考DP题,DP题我做了不超过10题。所以拿道题我也没敢用DP
: 做。怕写错,就用递归做了。给你们看看我做的吧。最后代码没啥问题,我刚刚跑了几
: 个测试都过了。
: void maxSubwords(int subs, string& str, map& dict,int id, int &
: maxNumber){
: if(id == str.size()){
: maxNumber = max(subs,maxNumber);
: return;
: }

avatar
j*y
46
比如 算 dp[4], n = 100
先初始化 dp[4] = 100, 这个数字表示没办法 break s[0,...,4]
j = 0, 表示 break s[0,...,4]成 s[0] 和 s[1,...,4]
这时候如果 s[1,...,4]是一个单词的话,
那么 dp[4] = min(dp[4], dp[0] + 1)
j = 1, 表示 break s[0,...,4]成 s[0,...,1] 和 s[2,...,4]
这时候如果 s[2,...,4]是一个单词的话,那么 dp[4] = min(dp[4], dp[1] + 1)
j = 2,...
j = 3,...

【在 l*********8 的大作中提到】
: dp[i] = min(dp[i], dp[j] + 1);
: 为什么用min?

avatar
w*a
47
谁能想到他们电面就开始DP。。。

【在 f*****e 的大作中提到】
: facebook肯定看复杂度的,recursive效率太低,burtal force应该不难吧。
: 不过这题有比较经典的O(N)算法。
:
: DP

avatar
M*5
48
anything is possible
你也可能不会想到面Graph里面的shortest path的,所以做好准备确实是最关键的。。。
anyway, Big Bless for your Google interview!

【在 w****a 的大作中提到】
: 谁能想到他们电面就开始DP。。。
avatar
w*a
49
我也不知道。。反正他给我指出让我改了
代码洁癖吧

【在 H****s 的大作中提到】
: 循环用 i 为啥不可以啊? 几乎所有人都这样写啊。
avatar
w*a
50
是啊 归根结底还是准备不充分

。。

【在 M********5 的大作中提到】
: anything is possible
: 你也可能不会想到面Graph里面的shortest path的,所以做好准备确实是最关键的。。。
: anyway, Big Bless for your Google interview!

avatar
b*w
51
新新手问一下:啥是DP?

【在 w****x 的大作中提到】
: DP经典题, 递归也可以吧
avatar
l*8
52
谢谢解释。我把题目理解为:把字符串分成尽量多的单词了。。。。

【在 j*****y 的大作中提到】
: 比如 算 dp[4], n = 100
: 先初始化 dp[4] = 100, 这个数字表示没办法 break s[0,...,4]
: j = 0, 表示 break s[0,...,4]成 s[0] 和 s[1,...,4]
: 这时候如果 s[1,...,4]是一个单词的话,
: 那么 dp[4] = min(dp[4], dp[0] + 1)
: j = 1, 表示 break s[0,...,4]成 s[0,...,1] 和 s[2,...,4]
: 这时候如果 s[2,...,4]是一个单词的话,那么 dp[4] = min(dp[4], dp[1] + 1)
: j = 2,...
: j = 3,...

avatar
w*a
53
就是一个循环的判断,我没注意到。。

【在 a***o 的大作中提到】
: 具体啥bug?
avatar
z*8
54
新手弱弱的回你,dynamic programming,动态规划。。

【在 b*w 的大作中提到】
: 新新手问一下:啥是DP?
avatar
b*w
55
谢了。知道了这个,我也应该从新新手升级到新手了

【在 z*******8 的大作中提到】
: 新手弱弱的回你,dynamic programming,动态规划。。
avatar
P*b
56
我在觉得这道题递归比DP要难呢

【在 M********5 的大作中提到】
: int combCount(std::string& str, std::set& dict){
: if( str.length()==0 )
: return 1;
:
: int count = 0;
: for(int i=1; i<=str.length(); i++){
: std::string first = str.substr(0,i);
: if( i==str.length() ){
: if( dict.find(first)==dict.end() )
: return -1;

avatar
l*a
57
这题不就是这个意思吗?

【在 l*********8 的大作中提到】
: 谢谢解释。我把题目理解为:把字符串分成尽量多的单词了。。。。
avatar
s*0
58
bless g

【在 w****a 的大作中提到】
: "10分钟前面经"系列的第三弹,这次是F家电二面。
: 不用大家Bless了,这次必挂了。就问了一道技术题。
: Word breaking
: // How many spaces can we add to a word such that:
: // All subwords can be found within a given dictionary
: // fireman
: // fire man -> 2 words
: // fir em an -> 3 words
: /* DICT
: a

avatar
c*t
59
我觉得你理解的对,应该用max

【在 l*********8 的大作中提到】
: 谢谢解释。我把题目理解为:把字符串分成尽量多的单词了。。。。
avatar
c*t
60
够简洁,不懂c++,但目测好像过不了test case "bafireman"

【在 d*****y 的大作中提到】
: int numofword(string& S)
: {
: unordered_set dict;
: dict.insert(string("a"));
: dict.insert(string("an"));
: dict.insert(string("em"));
: dict.insert(string("fir"));
: dict.insert(string("fire"));
: dict.insert(string("ire"));
: dict.insert(string("ma"));

avatar
w*a
61
DP思路对了就很简单了,代码好写啊。
递归考编码功底,我就出了BUG了。虽然后来改对了但是面试官肯定不开心了。
我现在吸取经验了,考功底的题,一定要实现把所有的测试用例都写好。代码写完了挨
个测试,都通过了再跟面试官说it's ok。这次就是吃的这个亏。

【在 P*******b 的大作中提到】
: 我在觉得这道题递归比DP要难呢
avatar
b*e
62
lz说了这个题有个前提是 All subwords can be found within a given dictionary,
否则的话就复杂了吧。

【在 c********t 的大作中提到】
: 够简洁,不懂c++,但目测好像过不了test case "bafireman"
avatar
d*x
63
用递归的dp啊。。

【在 w****a 的大作中提到】
: DP思路对了就很简单了,代码好写啊。
: 递归考编码功底,我就出了BUG了。虽然后来改对了但是面试官肯定不开心了。
: 我现在吸取经验了,考功底的题,一定要实现把所有的测试用例都写好。代码写完了挨
: 个测试,都通过了再跟面试官说it's ok。这次就是吃的这个亏。

avatar
c*t
64
哦,这样啊,其实也不复杂,加个判断if(i==0)....就可以了

【在 b********e 的大作中提到】
: lz说了这个题有个前提是 All subwords can be found within a given dictionary,
: 否则的话就复杂了吧。

avatar
j*2
65
这题跟cc150的17.14几乎一样吧?只不过17.14是求令非法字符最少的分法,这个是求
令合法单词数最多的分法,只要小小改动就行。递归DP。循环DP不行吧?
avatar
e*s
66
这题他是要随意一个分法,还是有要求(分出最少的词 或 分出最多的词)
下面是一个递归写法,DFS找到第一个分法
public static String segmentStringRecursive(String s, Set dict){
if(dict.contains(s)) return s;
int len = s.length();
for(int i = 1; i < len; i++)
{
String prefix = s.substring(0, i);
if(dict.contains(prefix))
{
String suffix = s.substring(i);
String segSuffix = segmentStringRecursive(suffix, dict);
if(segSuffix != null)
return prefix + " " + segSuffix;
}
}
return null;
}
avatar
w*a
67
求分出最多的。

【在 e***s 的大作中提到】
: 这题他是要随意一个分法,还是有要求(分出最少的词 或 分出最多的词)
: 下面是一个递归写法,DFS找到第一个分法
: public static String segmentStringRecursive(String s, Set dict){
: if(dict.contains(s)) return s;
: int len = s.length();
: for(int i = 1; i < len; i++)
: {
: String prefix = s.substring(0, i);
: if(dict.contains(prefix))
: {

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