由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 做一下common prefix in sorted string arrays
相关主题
说好得FG面经,回馈板上GGJJ问一道最近的onsite题
搞了小半个月,leetcode还有20题今天才整明白Permutation的最优解!?
最新L家面经Google Phone Interview
google seti onsite4sum的那道题
Microsoft screening programming problem好象是google的高频题目
上一道我以前喜欢出的题目吧一道字符串题目
求问一道面试题谷歌面经
问一道uber onsite题目leetcode的run time error
相关话题的讨论汇总
话题: nmid话题: int话题: strs话题: npos话题: string
进入JobHunting版参与讨论
1 (共1页)
w****x
发帖数: 2483
1
//Print strings with certain prefix in a sorted string array
void GetIndex(const char* strs[], int nBeg, int nEnd, char chr, int nPos,
OUT int& index1, int& index2);
void PrintComPrefix(const char* strs[], int n, const char* szPre)
{
assert(strs && szPre && n > 0);
const char* p = szPre;
int nIndex1 = 0;
int nIndex2 = n-1;
while (*p != 0 && nIndex1 >= 0)
{
GetIndex(strs, nIndex1, nIndex2, *p, p-szPre, nIndex1, nIndex2);
p++;
}
if (nIndex1 >= 0 && nIndex2 >= nIndex1)
{
for (int i = nIndex1; i <= nIndex2; i++)
cout< }
else cout<<"No string contain this orefix"< }
void GetIndex(const char* strs[], int nBeg, int nEnd, char chr, int nPos,
OUT int& index1, int& index2)
{
if (nBeg < 0 || nEnd < nBeg || nPos < 0)
{
index1 = index2 = -1;
return;
}
//left boundary
int s = nBeg;
int e = nEnd;
index1 = -1;
while (s <= e)
{
int nMid = (s + e)/2;
if (strs[nMid][nPos] == chr && (nMid == nBeg ||
strs[nMid][nPos] != strs[nMid-1][nPos]))
{
index1 = nMid;
break;
}
else if (strs[nMid][nPos] > chr || strs[nMid][nPos] == chr)
e = nMid - 1;
else s = nMid + 1;
}
//right boundary
s = nBeg;
e = nEnd;
index2 = -1;
while (s <= e)
{
int nMid = (s + e)/2;
if (strs[nMid][nPos] == chr && (nMid == nEnd ||
strs[nMid][nPos] != strs[nMid+1][nPos]))
{
index2 = nMid;
break;
}
else if (strs[nMid][nPos] < chr || strs[nMid][nPos] == chr)
s = nMid + 1;
else e = nMid - 1;
}
}
z****h
发帖数: 164
2
private void printstringwithprefix(String[] ss, String prefix) {
if(ss == null) return;
if(prefix == null || prefix.isEmpty()) return;
int low = 0;
int high = ss.length -1;
for(int i = 0; i< prefix.length() && low <= high; i++)
{
int mid = (low+high)/2;

if(i >= ss[mid].length())
{
return;
}

if(ss[mid].charAt(i) < prefix.charAt(i))
low = mid + 1;
else if(ss[mid].charAt(i) > prefix.charAt(i))
high = mid -1;
else // ==
{
low = mid;
high = mid;
while(low> 0 && ss[low - 1].charAt(i) == prefix.charAt(i))
--low;
while(high < ss.length -1 && ss[high + 1].charAt(i) ==
prefix.charAt(i))
++high;
}
}
if(low > high)
return;
for(int i = low; i <= high; i++)
Helper.println(ss[i]);
}
p*****2
发帖数: 21240
3
这题有什么tricky得地方吗?
p*****2
发帖数: 21240
4
这是zhangchi面经里的题吧?应该就是binary search吧。
w****x
发帖数: 2483
5

没啥trick, 就是binary search.
现在的题都没啥太难得, 就是考binary search的变种和编程的细节.
不过这题白板写说实话真心不容易

【在 p*****2 的大作中提到】
: 这是zhangchi面经里的题吧?应该就是binary search吧。
p*****2
发帖数: 21240
6

找两边的boundary能不能合并一下?做个sub function?

【在 w****x 的大作中提到】
:
: 没啥trick, 就是binary search.
: 现在的题都没啥太难得, 就是考binary search的变种和编程的细节.
: 不过这题白板写说实话真心不容易

l*****a
发帖数: 14598
7
把题说清楚点吧
是数组所有string的common prefix?

【在 w****x 的大作中提到】
: //Print strings with certain prefix in a sorted string array
: void GetIndex(const char* strs[], int nBeg, int nEnd, char chr, int nPos,
: OUT int& index1, int& index2);
: void PrintComPrefix(const char* strs[], int n, const char* szPre)
: {
: assert(strs && szPre && n > 0);
: const char* p = szPre;
: int nIndex1 = 0;
: int nIndex2 = n-1;
: while (*p != 0 && nIndex1 >= 0)

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

其实还真能合, 写这个程序的时候这里就很别扭, 不过算了, 麻烦死了

【在 p*****2 的大作中提到】
:
: 找两边的boundary能不能合并一下?做个sub function?

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

呵呵。F家BS是必考的。这道题也差不多算很难的了。我有时间也得练练。这两天太累
,没心情做题。看你做的很开心呀。

【在 w****x 的大作中提到】
:
: 其实还真能合, 写这个程序的时候这里就很别扭, 不过算了, 麻烦死了

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

感情受挫折了, 心烦做题玩, 每天都不知道该干啥, 难受死了.
一天也就两道题, 算起来一共就不到一小时, 短的半小时.

【在 p*****2 的大作中提到】
:
: 呵呵。F家BS是必考的。这道题也差不多算很难的了。我有时间也得练练。这两天太累
: ,没心情做题。看你做的很开心呀。

相关主题
上一道我以前喜欢出的题目吧问一道最近的onsite题
求问一道面试题今天才整明白Permutation的最优解!?
问一道uber onsite题目Google Phone Interview
进入JobHunting版参与讨论
y**********u
发帖数: 6366
11
比我强
我发现我不光水平差,而且对cs完全没兴趣,书一看5页就想上youtube

太累

【在 w****x 的大作中提到】
:
: 感情受挫折了, 心烦做题玩, 每天都不知道该干啥, 难受死了.
: 一天也就两道题, 算起来一共就不到一小时, 短的半小时.

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

这么强?5页?我一般就看半页。

【在 y**********u 的大作中提到】
: 比我强
: 我发现我不光水平差,而且对cs完全没兴趣,书一看5页就想上youtube
:
: 太累

p*****2
发帖数: 21240
13
写了一个练练手。
// assume prefix exists
int Find(String[] words, String prefix, boolean left)
{
int l = 0;
int r = words.length - 1;
while (l < r)
{
int m = left ? l + (r - l) / 2 : l + (r - l + 1) / 2;
String s = words[m];
if (s.length() > prefix.length())
s = s.substring(0, prefix.length());
if (s.compareTo(prefix) < 0)
{
l = m + 1;
}
else if (s.compareTo(prefix) > 0)
{
r = m - 1;
}
else
{
if (left)
{
r = m;
}
else
{
l = m;
}
}
}
return l;
}
w****x
发帖数: 2483
14

bug, while里是<=

【在 p*****2 的大作中提到】
: 写了一个练练手。
: // assume prefix exists
: int Find(String[] words, String prefix, boolean left)
: {
: int l = 0;
: int r = words.length - 1;
: while (l < r)
: {
: int m = left ? l + (r - l) / 2 : l + (r - l + 1) / 2;
: String s = words[m];

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

我怎么觉得==的时候就可以退出了?我是assume prefix是存在的。

【在 w****x 的大作中提到】
:
: bug, while里是<=

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

要是数组只有一个, 而且这个满足条件, 你的程序直接跳出来找不到了

【在 p*****2 的大作中提到】
:
: 我怎么觉得==的时候就可以退出了?我是assume prefix是存在的。

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

String[] ss = new String[]
{ "aaa", "abc", "abcd", "abcde", "bbb" };
out.println(Find(ss, "abcde", true));
out.println(Find(ss, "abcde", false));
o我的程序返回3

【在 w****x 的大作中提到】
:
: 要是数组只有一个, 而且这个满足条件, 你的程序直接跳出来找不到了

z****h
发帖数: 164
18
为啥一定要找分两次找left/right?
遇到m==prefix的时候,两边扩展一下找到边界不好吗?
p*****2
发帖数: 21240
19

那就是O(n)e了。

【在 z****h 的大作中提到】
: 为啥一定要找分两次找left/right?
: 遇到m==prefix的时候,两边扩展一下找到边界不好吗?

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

没仔细看你程序, 你试试数组就一个string: abcdef 找prefix "abc"能找到就成

【在 p*****2 的大作中提到】
:
: 那就是O(n)e了。

相关主题
4sum的那道题谷歌面经
好象是google的高频题目leetcode的run time error
一道字符串题目linkedin电面题
进入JobHunting版参与讨论
p*****2
发帖数: 21240
21

恩。返回的0.

【在 w****x 的大作中提到】
:
: 没仔细看你程序, 你试试数组就一个string: abcdef 找prefix "abc"能找到就成

t********e
发帖数: 143
22

没错,我总是搞不清最后几数。差不多4个case:
1. search for a number.
2. search for insert index.
3. search for lower bound of a range.
4. search for upper bound of range.

【在 w****x 的大作中提到】
:
: 没仔细看你程序, 你试试数组就一个string: abcdef 找prefix "abc"能找到就成

z****h
发帖数: 164
23
不是从头找。是二分找到一个相等值后,再左右两边扩展找左右边界。o(lgn +k
) k =有相同prefix的string的个数。

【在 p*****2 的大作中提到】
:
: 恩。返回的0.

z****h
发帖数: 164
24
int m = left ? l + (r - l) / 2 : l + (r - l + 1) / 2;
是为啥?

【在 p*****2 的大作中提到】
: 写了一个练练手。
: // assume prefix exists
: int Find(String[] words, String prefix, boolean left)
: {
: int l = 0;
: int r = words.length - 1;
: while (l < r)
: {
: int m = left ? l + (r - l) / 2 : l + (r - l + 1) / 2;
: String s = words[m];

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

+k
k跟n没什么区别。时间复杂度一样。

【在 z****h 的大作中提到】
: 不是从头找。是二分找到一个相等值后,再左右两边扩展找左右边界。o(lgn +k
: ) k =有相同prefix的string的个数。

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

不然会有死循环

【在 z****h 的大作中提到】
: int m = left ? l + (r - l) / 2 : l + (r - l + 1) / 2;
: 是为啥?

z****h
发帖数: 164
27
有道理

【在 p*****2 的大作中提到】
:
: 不然会有死循环

1 (共1页)
进入JobHunting版参与讨论
相关主题
leetcode的run time errorMicrosoft screening programming problem
linkedin电面题上一道我以前喜欢出的题目吧
问下Linkedin的一道电面求问一道面试题
开始刷leetcode,第一道题一直有run time error问一道uber onsite题目
说好得FG面经,回馈板上GGJJ问一道最近的onsite题
搞了小半个月,leetcode还有20题今天才整明白Permutation的最优解!?
最新L家面经Google Phone Interview
google seti onsite4sum的那道题
相关话题的讨论汇总
话题: nmid话题: int话题: strs话题: npos话题: string