boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问两道google题
相关主题
问两道字符串的题
讨论一道G的题find longest substring which contains just two unique characters.
LinkedIn onsite一道题
Extended dictionary lookup
google电面杯具,贡献题目
转划单词题的优解
一道G家店面题
Implement an web-based dictionary lookup
求大牛指教,字符串分割的DP做法!
10分钟前的F家电二面面经(必挂)
相关话题的讨论汇总
话题: int话题: dict话题: str话题: num话题: pos
进入JobHunting版参与讨论
1 (共1页)
i******s
发帖数: 301
1
前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
了,求祝福~
题:
1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
划分这个字符串,使得每个字符串都在dictionary中。
f***g
发帖数: 214
2
1. 有Binary Search可以找到元素第一次出现的位置。
以当前位置为始,再做找元素出现最后一次的位置的Binary Search
如果这个数量不多,就Linear。
只是有一点不明白,为什么要double,这是要考什么呢?
不能直接==?
i******s
发帖数: 301
3
可能是想考察比较double时不能直接用==吧,要用一个误差e来比较两个数,比如(a-b)
< e之类的。还有用binary search一次不能保证找到的一定是第一次出现的位置吧,
还是得要找多次,求分析

【在 f***g 的大作中提到】
: 1. 有Binary Search可以找到元素第一次出现的位置。
: 以当前位置为始,再做找元素出现最后一次的位置的Binary Search
: 如果这个数量不多,就Linear。
: 只是有一点不明白,为什么要double,这是要考什么呢?
: 不能直接==?

P********l
发帖数: 452
4
bless!
1. binary search for a range.
Remember to use the previous result.
2. I think it is correct to use DP. But your method will count result
multiple times.
example:
dictionary : aaa, bb, cc, aaabb, bbcc.
word: aaa, bb, cc.
V*****i
发帖数: 92
5
For the first one, do three binary searches. My code as follows. It is easy
to combine three binary searches into one routines through a flag, I wrote
this way for clearance.
int binary_search(int* num, int left, int right, int K) {
// find any pos such that num[pos] == K
if (left > right) return -1;
int mid = (left+right)/2;
if (K == num[mid]) return mid;
if (K < num[mid]) return binary_search(num, left, mid-1, K);
else return binary_search(num, mid+1, right, K);
}
int binary_search_l(int* num, int left, int right, int K) {
// find pos such that num[pos] < K && num[pos+1] == K
if (left > right) return -1;
int mid = (left+right)/2;
if (K == num[mid+1] && K > num[mid]) return mid;
if (K == num[mid]) return binary_search_l(num, left, mid-1, K);
else return binary_search_l(num, mid+1, right, K);
}
int binary_search_r(int* num, int left, int right, int K) {
// find pos such that num[pos] == K && num[pos+1] > K
if (left > right) return -1;
int mid = (left+right)/2;
if (K == num[mid-1] && K < num[mid]) return mid;
if (K == num[mid]) return binary_search_r(num, mid+1, right, K);
else return binary_search_r(num, left, mid-1, K);
}
int find_K(int* num, int N, int K) {
int pos = binary_search(num, 0, N-1, K);
int left_bound, right_bound;
if (pos == 0) left_bound = 0;
else left_bound = binary_search_l(num, 0, pos-1, K);
if (pos == N-1) right_bound = N-1;
else right_bound = binary_search_r(num, pos+1, N-1, K);
return right_bound-1-(left_bound+1)+1;
}

binary
worse

【在 i******s 的大作中提到】
: 前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
: 了,求祝福~
: 题:
: 1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
: 2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
: 划分这个字符串,使得每个字符串都在dictionary中。

j****a
发帖数: 55
6
第二题看不懂...能讲讲啥意思马?
楼上为啥3次binary search阿?? Don't get what's going on...
f***g
发帖数: 214
7
没有试验,但是觉得两次就够了
V*****i
发帖数: 92
8
For the second problem, it is correct to use DP.
But I think the correct formula should be T(n) = \sum_{i=1}^(n-1)(T(i)*H(i+1
, n)), here T(n) the number of partitions for string (1,n), H(i+1, n) if 1
of string (i+1, n) is in dict and 0 if string (i+1, n) is not.

binary
worse

【在 i******s 的大作中提到】
: 前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
: 了,求祝福~
: 题:
: 1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
: 2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
: 划分这个字符串,使得每个字符串都在dictionary中。

i******s
发帖数: 301
9
你的解法应该是对的,基于这个写了如下C++代码
/*
* Author: Shengzhe Yao
* Date: 08 Nov 2010
*/
#include
#include
#include
#include
using namespace std;
// T(n) = \sum_{i=1}^{n-1} (T(i) * H(i+1))
int findAllStr(const set &dict, char *str,
int end, int *lookup_table) {
if (lookup_table[end] > 0)
return lookup_table[end];
int total = 0;
for (int i=1; i < end; ++i) {
char *substr = (str+i+1);

if (dict.find(substr) != dict.end()) {
char tmp = str[i+1];
str[i+1] = '\0'; // To use default set comparator
if (dict.find(str) != dict.end()) {
// calculate all split ways between position 0 to i
total= findAllStr(dict, str, i, lookup_table);
}
str[i+1] = tmp;
}
}

if ((dict.find(str) != dict.end())) {
++total;
}
lookup_table[end] = total;
return total;
}
int main(int argc, char *argv[]) {
set dict;
dict.insert("a");
dict.insert("aa");
dict.insert("aaa");
dict.insert("aaaa");

char str[] = "aaaa";
int lookup_table[100];
for (int i=0; i < 100; ++i)
lookup_table[i] = -1;
printf("Total combination is: %d\n",
findAllStr(dict, str, strlen(str), lookup_table));
for (int i=0; i < 10; ++i)
printf("%d, ", lookup_table[i]);
printf("\n");
return 0;
}
s*****n
发帖数: 5488
10
can you write a bp program? really hard to me.
looks to me just a bfs or DFS searching with dictionary graph is enough. use
a static/global counter to count when you reach the end of the target
string.
foreach string S in D
{
if S prefix match T && T-S > null
recursively call on T - S, D
if T-s is null,
count++;
}
of caz, a trie or prefix tree can speed up the searching.

+1

【在 V*****i 的大作中提到】
: For the second problem, it is correct to use DP.
: But I think the correct formula should be T(n) = \sum_{i=1}^(n-1)(T(i)*H(i+1
: , n)), here T(n) the number of partitions for string (1,n), H(i+1, n) if 1
: of string (i+1, n) is in dict and 0 if string (i+1, n) is not.
:
: binary
: worse

相关主题
Extended dictionary lookup
google电面杯具,贡献题目
转划单词题的优解
一道G家店面题
进入JobHunting版参与讨论
j****a
发帖数: 55
11
能解释一下第二题是什么意思吗?看不懂?

binary
worse

【在 i******s 的大作中提到】
: 前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
: 了,求祝福~
: 题:
: 1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
: 2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
: 划分这个字符串,使得每个字符串都在dictionary中。

i******s
发帖数: 301
12
Thanks for pointing out the mistake !

【在 P********l 的大作中提到】
: bless!
: 1. binary search for a range.
: Remember to use the previous result.
: 2. I think it is correct to use DP. But your method will count result
: multiple times.
: example:
: dictionary : aaa, bb, cc, aaabb, bbcc.
: word: aaa, bb, cc.

i******s
发帖数: 301
13
就是有一个字典dict,里面有若干字符串。现在输入一个字符串str, 将str分成若干个
子串,要求每个子串都在dict中,问这样的切分方法有几种?

【在 j****a 的大作中提到】
: 能解释一下第二题是什么意思吗?看不懂?
:
: binary
: worse

j*****u
发帖数: 1133
14
1. two binary search
2. 可否用prefix tree?
for (int i = 0; i < str.lengh, ++i)
{
match str[i..k1], [k1+1..k2]...in prefix-tree until str.length-1,
continue if any match fails;
++count;
}

binary
worse

【在 i******s 的大作中提到】
: 前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
: 了,求祝福~
: 题:
: 1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
: 2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
: 划分这个字符串,使得每个字符串都在dictionary中。

r**u
发帖数: 1567
15
第二题,你的递归公式,把str分成A,B俩部分后,A继续会被划分,所以有重复。
end是str结尾的position,
F(i)是从i到end的划分个数,那么
F(i) = sum_{k = 1 to end-i} | F(i+k), if str[i, i+k-1] is a valid word.
| 0. Otherwise
对每个A,which is a valid word,划分B,然后加一起.

binary
worse

【在 i******s 的大作中提到】
: 前几天同学google电面回来,遇到两道题,想跟大家讨论一下。ps: 后天本人也要电面
: 了,求祝福~
: 题:
: 1. 给你一组排序好的double类型的数组,怎样求出某个数出现的次数。
: 2. 给你一个dictionary, 里面存着n个字符串,再给你一个字符串,请问有多少种方法
: 划分这个字符串,使得每个字符串都在dictionary中。

V*****i
发帖数: 92
16
There is no need to pass Dictionary and lookup table, use global variable or
use class. My solution as follows:
#include
#include
#include
#include
using namespace std;
// T(n) = \sum_{i=1}^{n-1} (T(i) * H(i+1))
const int MAXSIZE = 100;
class find_str {
private:
set dict;
int lookup_table[MAXSIZE];
public:
find_str(set &d) {
dict = d;
for (int i=0; i }
int findAllStr(const string &str, int pos) {
if (lookup_table[pos] != -1)
return lookup_table[pos];
int total = 0;
for (size_t i=1; i <= pos; ++i) {
string substr = str.substr(i, pos-i+1);
if (dict.find(substr) != dict.end())
total += findAllStr(str, i-1);
}
if (dict.find(str.substr(0, pos+1)) != dict.end()) ++total;
lookup_table[pos] = total;
return total;
}
};
int main(int argc, char *argv[]) {
set dict;
dict.insert("aaa");
dict.insert("bb");
dict.insert("cc");
dict.insert("aaabb");
dict.insert("bbcc");
find_str f(dict);
string str = "aaabbcc";
printf("Total combination is: %d\n", f.findAllStr(str, str.length()-
1));
return 0;
}

在 ipodfans (jojo) 的大作中提到: 】
b****n
发帖数: 84
17
第一题可以参考std::equal_range()的实现
就是套用std::lower_bound()和std::upper_bound()
A*H
发帖数: 127
18
#q2
#include
#include
using namespace std;
int partition_count(map dict, string words) {
int count = 0;
if (dict[words])
count++;

for (int i=1, n=words.size(); i if (dict[words.substr(0, i)])
count += partition_count(dict, words.substr(i, n-i));
}
return count;
}
int main() {
map dict;
dict["aaa"] = true;
dict["bb"] = true;
dict["cc"] = true;
dict["aaabb"] = true;
dict["bbcc"] = true;
string words = "aaabbcc";
cout<< partition_count(dict, words) << endl;
return 1;
}
h**6
发帖数: 4160
19
map 这种结构不如直接改为 set
否则在程序运行结束后,所有 n(n-1)/2 个子字符串全部加入到map里去了。
1 (共1页)
进入JobHunting版参与讨论
相关主题
10分钟前的F家电二面面经(必挂)
问一个word ladder的题目
请教:这个10来行的leetcode程序有什么问题?
LeetCode: Word Ladder
问一道题(10)
wordbreak in C?
leetcode 的two sum
请教F家两道Design题
google 电面
问一个Google老题
相关话题的讨论汇总
话题: int话题: dict话题: str话题: num话题: pos