阿里巴巴20121009 研发/算法工程师 笔试试题

阿里巴巴20121009 研发/算法工程师 笔试试题_第1张图片阿里巴巴20121009 研发/算法工程师 笔试试题_第2张图片阿里巴巴20121009 研发/算法工程师 笔试试题_第3张图片

18、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的概率

第19题



a[i]在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a[i] <= a[i+2k]

所以数组a里实际上有2k个各自有序的、交错的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...} 

所以可以用2k-路归并排序,用一个大小为2k的小顶堆辅助归并,时间复杂度是O(n*log2k),小于O(nk)。



第20题:字符串数组seq[] = a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac...,aaa,baa,...

(1)aaa是第几个字符串

(2)ababacd是第几个

(3)第1000个字符串是什么

(4)编写函数find(),返回字符串在seq中是第几个(语言不限)


分析:

(1).长度,很容易推导出长度是n的字符串在第4^(n-1)个之后,aaa是1位和2位全排列后的第一个,即第4^(3-1)+4^(2-1)之后的第一个,也即第21个

(2)字符,每个字符可以判断出它之前的字符全排列了多少次,

字    符: a b a b a c d

全排列: 1 2 1 2 1 3 4

4^次幂: 0 1 2 3 4 5 6

即2*4^1+1*4^2+2*4^3+1*4^4+3*4^5+4*4^6 = 19864 (考场不让用计算器...换成2的次幂来算)

(3)把1000转为二进制是 11 11 10 10 00

他们分别对应4进制里的  3   3   2   2   0

对应字符就是 c c b b X,这里不好表示,先吧1000加个1

得到11 11 10 10 01,即c c b b a. 倒序就是abbcc,这里算出来的是1001的字符串

那第1000个是上一个, 即 abbcc-1 = dabcc

(4)可执行代码如下:

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. long find(char seq[]){  
  6.     long sum=0;  
  7.     long tmp=1;  
  8.     int len = strlen(seq);  
  9.     for (int i=0;i<len;i++)  
  10.     {  
  11.         sum+=(seq[i]-'a'+1)*tmp;  
  12.         tmp*=4;  
  13.     }  
  14.     return sum;  
  15. }  
  16.   
  17. int main(){  
  18.     cout<<find("ababacd")<<endl;  
  19.     cout<<find("abbcc")<<endl;  
  20.     cout<<find("dabcc")<<endl;  
  21.     cout<<find("aaa")<<endl;  
  22.     cout<<find("a")<<endl;  
  23.     return 0;  
  24. }  

你可能感兴趣的:(阿里巴巴20121009 研发/算法工程师 笔试试题)