首先声明:答案不是不保证正确定。如果有不同的意见和正确答案,给以给我留言。
11题:netstat -an
telnet ip port 均可以测试端口。
18题和答案来自于:http://blog.csdn.net/v_july_v/article/details/7974418
http://blog.csdn.net/v_july_v/article/details/7974418点评:
贝叶斯公式 + 全概率公式作答(参看链接:http://www.doc88.com/p-132711202556.html)。具体解答如下图所示:
第19题和20题目个答案来自于:http://blog.csdn.net/twtsa/article/details/8055143
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)。
个人方案:时间复杂为o(n*lgk),
基本思想:
方案:申请一个大小为k的堆,用0-k-1个数组的元素初始化这个堆。现在把第k个数组元素和堆顶相比较,如果比堆顶元素小,直接输出该第k个元素。如果大,淘汰堆顶的元素(输出堆顶元素),把第k个元素加到堆中,调整堆,调整的复杂度是lgk,这样需要操作n次,复杂度是n(lgk)。
ps:借助外排序的败者树的思想。
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
全排列: 0 1 0 1 0 2 3
4^次幂: 0 1 2 3 4 5 6
即1*4^1+1*4^3+2*4^5+3*4^6 = 14405(考场不让用计算器...换成2的次幂来算)
(3)把1000转为二进制是 11 11 10 10 00
他们分别对应4进制里的 3 3 2 2 0
对应字符就是 d d c c a,倒序就是accdd,这里算出来的是1001的字符串
第1000个是上一个, 即 accdd-1 = dbcdd
(4)可执行代码如下:
- #include <iostream>
- #include <string>
- using namespace std;
- long find(char seq[]){
- long sum=1;
- long tmp=1;
- int len = strlen(seq);
- for (int i=0;i<len;i++)
- {
- sum+=(seq[i]-'a')*tmp;
- tmp*=4;
- }
- return sum;
- }
- int main(){
- cout<<find("ababacd")<<endl;
- cout<<find("dbcdd")<<endl;
- return 0;
- }
个人思想与理解: