c语言字符串前后对调,部分C语言程序题2

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值