问一道FB面试题 - 未名空间(mitbbs.com)
我们的手机,几乎每个键都对应字母: key2 -> 'abc', key3 -> 'def', key4 -> '
ghi'....老式的手机打字的原理是,如果你要打出a,你需要按1下key2. 如果要打出b
,你需要按2下key2, 打出c就要按3下key2,因为c排在key2的第三位。
所以题目是给出,keySize[] 每个element代表能存放的最多character, 比如上面的
例子就是[3,3,3],因为每个key都能最多放3个字母; 还有frequency[],每个element
代表每个character出现的频率。要求把character排入key中,通过上面的方法打出所
有frequency数组中的character,最少的按键次数。
下面给个例子,比如我们的keysize是 [3,1,2],我们的character的frequency是 [3,
3, 3, 2,1,1]。 如果把frequency中头三个字母index0 - index2放入key1, index3
放入key2,index4-index5放入key3,这样的按键次数就是 3*1 + 3*2 + 3*3 + 2*1 +
1*1 + 1*2。character可以打乱随意放,只要不超过keySize的limit。
follow up的要求就是character必须要找 frequency的order来,index2必能放在
index1之前。
Greedy:
http://likemyblogger.blogspot.com/2015/09/mj-36-arrange-keys.html
Read full article from 问一道FB面试题 - 未名空间(mitbbs.com)
我们的手机,几乎每个键都对应字母: key2 -> 'abc', key3 -> 'def', key4 -> '
ghi'....老式的手机打字的原理是,如果你要打出a,你需要按1下key2. 如果要打出b
,你需要按2下key2, 打出c就要按3下key2,因为c排在key2的第三位。
所以题目是给出,keySize[] 每个element代表能存放的最多character, 比如上面的
例子就是[3,3,3],因为每个key都能最多放3个字母; 还有frequency[],每个element
代表每个character出现的频率。要求把character排入key中,通过上面的方法打出所
有frequency数组中的character,最少的按键次数。
下面给个例子,比如我们的keysize是 [3,1,2],我们的character的frequency是 [3,
3, 3, 2,1,1]。 如果把frequency中头三个字母index0 - index2放入key1, index3
放入key2,index4-index5放入key3,这样的按键次数就是 3*1 + 3*2 + 3*3 + 2*1 +
1*1 + 1*2。character可以打乱随意放,只要不超过keySize的limit。
follow up的要求就是character必须要找 frequency的order来,index2必能放在
index1之前。
Greedy:
http://likemyblogger.blogspot.com/2015/09/mj-36-arrange-keys.html
int clicks(vector<int> keySize, vector<int> frequency){
int n = frequency.size(), ret = 0, pos = 0, i = 0;
sort(frequency.begin(), frequency.end(), greater<int>());
while
(i<n){
for
(int j=0; j<(int)keySize.size(); ++j){
if
(i==n)
break
;
if
(j==0) pos++;
if
(pos<=keySize[j]){
ret += frequency[i++]*pos;
}
}
}
return
ret;
}
};
int main(){
vector<int> keySize = {3,1,2};
vector<int> frequency = {2,1,1,3,3,3};
Solution sol;
cout<<sol.clicks(keySize, frequency)<<
"?=18"
<<endl;
return
0;
}