73.线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h。
答:Linklist *unio(Linklist *p,Linklist *q){
linklist *R,*pa,*qa,*ra;
pa=p;
qa=q;
R=ra=p;
while(pa->next!=NULL&&qa->next!=NULL){
if(pa->data>qa->data){
ra->next=qa;
qa=qa->next;
}
else{
ra->next=pa;
pa=pa->next;
}
}
if(pa->next!=NULL)
ra->next=pa;
if(qa->next!=NULL)
ra->next==qa;
return R;
}
74.运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adj[][N],如adj[i][j]=1则表示i区域与j区域相邻,数组color[N],如color[i]=1,表示i区域的颜色为1号颜色。
解答:着色问题,可以采用回溯法求解。(具体程序待给出)
75.用递归算法判断数组a[N]是否为一个递增数组。
解答:递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束:
bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n= =2 )
return a[n-1] >= a[n-2];
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
}
(也可以采用折半查找类似的思路。)
76.编写算法,从10亿个浮点数当中,选出其中最大的10000个。
解答:将这些数分成n组。对于每组可以用冒泡排序选出最大的10000个(冒10000次大泡即可),然后产生的n组,每组10000个数进行归并排序(或者再分组)即可。
77.编写一unix程序,防止僵尸进程的出现.
答:void add_fork(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
printf("退出进程号为:%d 系统新增进程序。\n",pid);
return;
}
main()
{
signal(SIGCHLD,add_fork);
if (fork()==0)
{
printf("%d process run....",getpid());
do_your_thing();
}
}
78.如果搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,
请描述思想,写出算发(c语言),空间和时间复杂度
答:可以将字符串通过hash函数映射到hash表里,对于hash值相同的则比较字符串,若相同则将该字符串的频率值加1,并记录在hash表里。等到此操作完成则来一次遍历,找出频率最大的10条。
79.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度
答:该问题的难点主要在于存储问题。可以采用windows的虚拟内存机制,将主题和跟贴分配足够大的虚拟内存(用VirtualAlloc保留),等到程序需要显示时,,以限制每一屏幕的帖子数目,将对应的虚拟内存提交(VirtualAlloc)即可。等到该屏幕不在需要时将该内存调度出物理内存。
请列举一个软件中时间换空间或者空间换时间的例子。
答:交换函数void swap1(int a,int b)
{
int c; c=a;a=b;b=a;
}
和
void swap2(int a,int b)
{
a=a+b;b=a-b;a=a-b;
}
81.请问一下程序将输出什么结果?
char *RetMenory(void)
{
char p[] = “hellow world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
答:RetMemory执行完毕,p指向的字符串被释放。所以str的值是不可预测的。
82.写一个函数,它的原形是int continumax(char *outputstr,char
*intputstr)
功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:
"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为
123456789。
答:#include "stdafx.h"
int continumax(char** outputstr,char *inputstr);
int _tmain(int argc, _TCHAR* argv[])
{
char str[] = "abcd12345ed125ss123456789";
char* outstr;
if(continumax(&outstr,str) > 0)
printf("%s",outstr);
return 0;
}
int continumax(char** outputstr,char* inputstr)
{
if(inputstr == NULL)
{
outputstr = NULL;
return 0;
}
int len = strlen(inputstr);
int index = 0;
int num = 0;
int MAX = 0;
int MaxIndex = 0;
while(index < len)
{
while(inputstr[index] > 47 && inputstr[index] <
58)
{
num++;
index++;
}
if(num > MAX)
{
MAX = num;
MaxIndex = index - num;
num = 0;
}
index++;
num = 0;
}
if(MAX != 0)
{
*outputstr = (char*)malloc(MAX + 1);
for(int i = 0;i < MAX;i++)
{
(*outputstr)[i] = inputstr[MaxIndex + i];
}
(*outputstr)[MAX] = '\0';
return MAX;
}
return 0;
}
83.不用库函数,用C语言实现将一整型数字转化为字符串。
答:用该整数不断去除以10,得到的余数添加到字符串中。最后将字符串方向。
int getlen(char* s)
{ int n = 0;
while(*s != '\0')
{ s++;
n++;
}
return n;
}
void reverse(char s[])
{ int i,j;
for(i=0,j=getlen(s)-1;i!=j;i++,j--)
{ char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
void inttoc(int n,char s[])
{
int i=0;
do
{
s[i] = n % 10 + '0';
i++;
}while((n = n /10) != 0);
s[i] = '\0';
reverse(s);
}
64.typedef struct
{
int a:2;
int b:2;
int c:1;
}test;
test t;
t.a = 1;
t.b = 3;
t.c = 1;
printf("%d",t.a);
printf("%d",t.b);
printf("%d",t.c);
输出是?
答:1,-1,-1。由于t.a = 01,t.b = 11,t.c =
1,对于整数来说最高位即为符号位。
85.斐波拉契数列递归实现的方法如下:
int Funct( int n )
{
if(n==0)
return 1;
if(n==1)
return 1;
retrurn Funct(n-1) +
Funct(n-2);
}
请问,如何不使用递归,来实现上述函数?
答:int Funct( int n
) // n 为非负整数
{
int
a=0;
int
b=1;
int
c;
if(n==0)
c=1;
else
if(n==1) c=1;
else
for(int i=2;i<=n;i++) //应该n从2开始算起
{
c=a+b;
a=b;
b=c;
}
return
c;
}
86.求组合数:
求n个数(1....n)中k个数的组合....如:combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,ngh,(考虑实现真正的组合数)
解答:#include
int pop(int *);
int push(int );
void combination(int ,int );
int stack[3]={0};
int top=-1;
int main()
{
int n,m;
printf("Input two numbers:\n");
while( (2!=scanf("%d%*c%d",&n,&m)) )
{
fflush(stdin);
printf("Input error! Again:\n");
}
combination(n,m);
printf("\n");
return 0;
}
void combination(int m,int n)
{
int temp = m;
push(temp);
while(1)
{
if(1 == temp)
{
if(pop(&temp) && stack[0] == n)
break;
}
else
{
if(push(--temp))
{
printf("%d%d%d ",stack[0],stack[1],stack[2]);//§ä¨ì¤@?
pop(&temp);
}
}
}
}
int push(int i)
{
stack[++top]=i;
if(top<2)
return 0;
else return 1;
}
int pop(int *i)
{
*i=stack[top--];
if(top>=0)
return 0;
else return 1;
}
87.用指针的方法,将字符串“ABCD1234efgh”前后对调显示
解答:#include
#include
#include
int main()
{
char* str = "ABCD1234efgh";
int len = strlen(str);
char* reStr = (char*)malloc(len + 1);
strcpy(reStr,str);
reStr[len] = '\0';
char* start = reStr;
char* end = &reStr[len - 1];
while(start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
printf(reStr);
return 0;
}
88.指出下列程序的问题
void test2()
{
char
string[10], str1[10];
int
i;
for(i=0;
i<10; i++)
{
str1[i] = 'a';
}
strcpy(
string, str1 );
}
解答:str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以不能结束
strcpy( char *s1,char
*s2)他的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到碰到'\0',因为str1结尾没有'\0',所以具有不确定性,不知道他后面还会付什么东东。
正确应如下
void test2()
{
char
string[10], str1[10];
int
i;
for(i=0;
i<9; i++)
{
str1[i] = 'a'+i; //把abcdefghi赋值给字符数组
}
str[i]='\0';//加上结束符
strcpy(
string, str1 );
}
89.自己实现strcmp函数
解答:
/********************************华为的题****************************/
90.
已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
解答:此题较为简单,这里不再详述。
91.有一个16位的整数,每4位为一个数,写函数求他们的和。
解答:char sumOfQuards(unsigned short n)
{
int i = 4;
char c = 0;
do{
c += n & 15;
n = n >> 4;
}while(--i);
return c;
}
92.有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.
解答:void Sort(int* array,int len)
{
for(int i = 0;i < len;)
{
int temp = array[array[i] - 1];
array[array[i] - 1] = array[i];
array[i] = temp;
if(array[i] == i + 1)
i++;
}
}
93.下列程序输出什么:int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf(“
%d %d ”, *ptr, *(++ptr));
输出:8 8
过程:对于*(ptr++)+=123;先做加法6+123,然后++,指针指向7;对于printf(“
%d %d ”, *ptr,
*(++ptr));从后往前执行,指针先++,指向8,然后输出8,紧接着再输出8。