一、选择
1、哪些不是加密算法?(MD5)
A、MD5 B、DES C、RC4 D、RSA
2、垃圾回收相关表述错误?(B、计数引用不能处理循环引用,但垃圾回收可以,所以A没错)
A、垃圾回收可以处理循环引用
B、垃圾回收就不会有内存泄漏
3、最大生成树题(Kruskal按边排序,取不形成环的最大边即可)
4、5个a,3个b,2个c排列,其中包括abc子串的共有?(注意重复)
5、树最少去掉几个节点形成非连通图?(1个)
6、关于内核描述错误的是(D)
D、文件系统和驱动一定属于内核
总结:10个选择题,目前已经确定错了3个。
二、编程题
1、环形公路,D中存i,i+1距离,给任意i,j,求i,j最短距离。
2、字符串处理,压缩空格,字串反转。如"abc def gk"=>"cba fed kg"
3、多种面值的纸币找零一个面值的方法数,标准硬币找零问题。
参考代码:
1、
#include <stdio.h> #include <string.h> const int N = 8; double D[N]={5,4,3,8,2,1,9,6}; int n = sizeof(D)/sizeof(double); void pre() { #ifdef DEBUG for(int i=0;i<n;i++) printf("D%d:%lf\n", i, D[i]); #endif double tmp[N+1]; memset(tmp,0,sizeof(int)*N); for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) tmp[j]+=D[i]; D[0]+=tmp[n]; memcpy(D+1,tmp+2,sizeof(double)*(N-1)); #ifdef DEBUG printf("All:%lf\n", D[0]); printf("1 to 1:0\n"); for(int i=1;i<n;i++) printf("1 to %d:%lf\n", i+1, D[i]); #endif } double dis(int i, int j) { int a = i>j?j:i; int b = i>j?i:j; if(i==j || i<=0 || i>N || j<=0 || j>N) return 0; int db, da; db = b-1==0?0:D[b-1]; da = a-1==0?0:D[a-1]; double d1 = db-da; double d2 = D[0]-d1; return d1>d2?d2:d1; } int main() { int a = 1, b = 3; pre(); printf("\nans:%d to %d:%lf\n", a, b, dis(a,b)); a = 2, b = 5; printf("\nans:%d to %d:%lf\n", a, b, dis(a,b)); return 0; }
#include <stdio.h> void print(const char* s) { bool space_flag = true; const int N = 1024; char buf[N]; int i,j; i = j = 0; while(s[i]!='\0') { if(s[i]!=' ') { buf[j++]=s[i]; space_flag = true; }else if(space_flag) { buf[j]='\0'; for(int k=0;k<(j-1)/2;k++){ char tmp = buf[k]; buf[k]=buf[j-1-k]; buf[j-1-k]=tmp; } printf("%s ", buf); buf[0]='\0'; j=0; space_flag = false; } i++; } buf[j]='\0'; printf("%s\n", buf); } int main() { const char* str="abc def gk"; print(str); return 0; }
3、
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int value[]={1,2,5,10}; int size = sizeof(value)/sizeof(int); int foo(int n) { int* c[size+1]; for(int i=0;i<size+1;i++) c[i]=(int*)calloc((n+1),sizeof(int)); for(int i=0;i<=n;i++){ c[0][i] = i%value[0]==0?1:0; } for(int i=1;i<size;i++) for(int j=0;j<=n;j++) for(int k=0;k<=j/value[i];k++) c[i][j]+=c[i-1][j-k*value[i]]; int ans = c[size-1][n]; for(int i=0;i<size+1;i++) free(c[i]); return ans; } int main() { for(int i=0;i<7;i++){ int a = (double)pow(10,i); printf("%d\t%d\n",a,foo(a)); } return 0; }