阿里巴巴20121009 研发/算法工程师 笔试试题【修正】

第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)可执行代码如下:

#include <iostream>
#include <string>
using namespace std;

long find(char seq[]){
	long sum=0;
	long tmp=1;
	int len = strlen(seq);
	for (int i=0;i<len;i++)
	{
		sum+=(seq[i]-'a'+1)*tmp;
		tmp*=4;
	}
	return sum;
}

int main(){
	cout<<find("ababacd")<<endl;
	cout<<find("abbcc")<<endl;
	cout<<find("dabcc")<<endl;
	cout<<find("aaa")<<endl;
	cout<<find("a")<<endl;
	return 0;
}


没有更多推荐了,返回首页