2024年6月15日发(作者:)

华为机试题

【2011】

1、

(stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏

例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、

realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit())

#include

#include

#include

#include

#define LENGTH 13

int verifyMsisdn(char *inMsisdn)

{

char *pchar=NULL;

assert(inMsisdn!=NULL);

if(LENGTH==strlen(inMsisdn))

{

if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6'))

{

while(*inMsisdn!='0')

{

if((*inMsisdn>='0')&&(*inMsisdn<='9'))

inMsisdn++;

else

return 2 ;

}

}

else

return 3;

}

else

return 1;

return 0;

}

int main()

{

char *pchar=NULL;

unsigned char ichar=0;

int result;

switch(ichar)

{

case 0:

pchar="86";break;

case 1:

pchar="8611";break;

case 2:

pchar="86s1234536366"; break;

default:

break;

}

result =verifyMsisdn(pchar);

printf("result is %dn",result);

}

华赛面试:

1.

char m[]={"I", "LOVE", "CHINA"}

char* p=m;

printf("%s", *p++);

printf("%c", **p);

int main()

{

double x=1;

double y;

y=x+3/2;

printf("%fn",y);

return 0;

} ////// 结果为2.000000

3.

4.找错

unsigned int f()

{

unsigned char a=123;

unsigned char res;

while(a-->=0)

{

res+=a;

}

return res;

}//res没有初始化

5.

struct node

{

int data;

node* pre;

node* next;

}

结构体数组转双向循环链表

1. 数组比较(20 分)

• 问题描述:

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果 2 个数组

长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较

中发现的不相等元素的个数

比如:

数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为 0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为 3

• 要求实现函数:

int array_compare(int len1, int array1[], int len2, int array2[])

【输入】 int len1:输入被比较数组 1 的元素个数;

int array1[]:输入被比较数组 1;

int len2:输入被比较数组 2 的元素个数;

int array2[]:输入被比较数组 2;

【输出】 无

【返回】 不相等元素的个数,类型为 int

• 示例

1) 输入:int array1[] = {1,3,5},int len1 = 3,

int array2[] = {77,21,1,3,5},int len2 = 5

函数返回:0

2) 输入:int array1[] = {1,3,5},int len1 = 3,

int array2[] = {77,21,1,3,5,7},int len2 = 6

函数返回:3

#include

#include

#include

int array_compare(int len1, int array1[], int len2, int array2[])

{

int count=0;

for( ;len1>0&&len2>0 ;len1--,len2--)

{

if(array1[len1-1]!=array2[len2-1])

{

count++;

}

} //蓝色字体部分也可以换成如下的代码

if(array1[len1-1]==array2[len2-1]) break; else count++;

return count;

}

int main()

{

int result=0;

int array1[]={1,3,5};

int len1=3;

int array2[]={77,12,1,3,5};

int len2=5;

result=array_compare( len1, array1, len2, array2);

///result=array_compare( len1, array1[], len2, array2[]);不能这样

// 函数形参

中永远只是传得首地址,不能传数组 切记切记!!!!!!

printf("the result is %d", result);

}

2. 约瑟夫问题

• 问题描述:

输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知),

和初始计数值 m。从数列首位置开始计数,计数到 m 后,将数列该位置数值替换

计数值 m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列

所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编

程实现上述计数过程,同时输出数值出列的顺序

比如: 输入的随机数列为:3,1,2,4,初始计数值 m=7,从数列首位置开始计数

(数值 3 所在位置)

第一轮计数出列数字为 2,计数值更新 m=2,出列后数列为 3,1,4,从数值 4 所

在位置从新开始计数

第二轮计数出列数字为 3,计数值更新 m=3,出列后数列为 1,4,从数值 1 所在

位置开始计数

第三轮计数出列数字为 1,计数值更新 m=1,出列后数列为 4,从数值 4 所在位

置开始计数

最后一轮计数出列数字为 4,计数过程完成。

输出数值出列顺序为:2,3,1,4。

• 要求实现函数:

void array_iterate(int len, int input_array[], int m, int output_arra

y[])

【输入】 int len:输入数列的长度;

int intput_array[]:输入的初始数列

int m:初始计数值

【输出】 int output_array[]:输出的数值出列顺序

【返回】 无

• 示例

输入:int input_array[] = {3,1,2,4},int len = 4, m=7

输出:output_array[] = {2,3,1,4}

////////////循环链表实现//////////////////////

#include

#include

#include

typedef struct Node

{

int num;

struct Node *next;

}node;

node *creat(int len,int input_array[])

{

node *h,*p,*s;

int i;

h=(node*)malloc(sizeof(node));

h->num=input_array[0];

p=h;

for(i=1;i

{

s=(node*)malloc(sizeof(node));

s->num=input_array[i];

p->next=s;

p=s;

}

p->next=h;

return(h);

}

void array_iterate(int len, int input_array[], int m, int output_array[])

{

node *p,*q,*s;

int i=0,j=0,k;

p=creat(len,input_array);

while(p->next!=p)

{

for(i=1;i

{

q=p;

p=p->next;

}

m=p->num;

printf("%5d",m);

output_array[j++]=m;

s=p;

q->next=p->next;

p=p->next;

free(s);

s=NULL;

}

m=p->num;

printf("%5dn",m);

output_array[j]=m;

k=j;

for(j=0;j<=k;j++)

{

printf("%5d",output_array[j]);

}

}

int main()

{

int input_array[]={3,1,2,4};

int len=4;

int m=7;

int output_array[4];

array_iterate(len,input_array,m,output_array);

}

3. 简单四则运算

• 问题描述:

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注: 1、表达式只含 +, -, *, / 四则运算符,不含括号

2、表达式数值只包含个位整数(0-9),且不会出现 0 作为除数的情况

3、要考虑加减乘除按通常四则运算规定的计算优先级

4、除法用整数除法,即仅保留除法运算结果的整数部分。比如 8/3=2。输入表

达式保证无 0 作为除数情况发生

5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算

符字符,除此之外不含其它任何字符,不会出现计算溢出情况

• 要求实现函数:

int calculate(int len,char *expStr)

【输入】 int len: 字符串长度;

char *expStr: 表达式字符串;

【输出】 无

【返回】 计算结果

• 示例

1) 输入:char *expStr = “1+4*5-8/3”

函数返回:19

2) 输入:char *expStr = “8/3*3”

函数返回:6

第六题:类似昨天 Sara 说的最后一题:

给你一个数组 a[],数组长度 len 以及一个整数 m

从数组中第一个数字数起 找到第 m 个数字 输出 a[m] 然后再将 a[m]赋值给

m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素

全部输出

第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:

有以下几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不相同数值的牌

4:两对

5:顺子 包括 10,J,Q,K,A

6:什么都不是

7:只有一对

第一题:比较一个数组的元素 是否为回文数组

#include

#include

int huiwen(char str[])

{

int i,len,k=1;

len=strlen(str);

for(i=0;i

{

if(str[i]!=str[len-i-1])

{

k=1;

break;

}

}

if(k==0)

printf("%s 不是一个回文数n",str);

else

printf("%s 是一个回文数n",str);

}

void main()

{

char str[100] = {0};

int i;

int len;

printf("Input a string:"); /*提示输入 Input a string:*/

scanf("%s", str); /*scan()函数输入一个字符串:*/

huiwen(str);

}

第二题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组

中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前

第三题:比较汗 求简单的四则运算

参与运算的数字只有 0--9

逆序单链表

第一题【20 分】:鉴定回文数组。

第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。

第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3

个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。

上午是输入一个数组,然后找出哪个比平均值大

上午是输入一个数组,然后找出哪个比平均值大

1. 手机号码合法性判断(20 分)

问题描述:

我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:

86。特点如下:

1、 长度 13 位;

2、 以 86 的国家码打头;

3、 手机号码的每一位都是数字。

请实现手机号码合法性判断的函数要求:

1) 如果手机号码合法,返回 0;

2) 如果手机号码长度不合法,返回 1

3) 如果手机号码中包含非数字的字符,返回 2;

4) 如果手机号码不是以 86 打头的,返回 3;

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如

果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。

要求实现函数:

int s int verifyMsisdn(char* inMsisdn)

【输入】 char* inMsisdn,表示输入的手机号码字符串。

【输出】 无

【返回】 判断的结果,类型为 int。

示例

输入: inMsisdn = “869123456789“

输出: 无

返回: 1

输入: inMsisdn = “889“

输出: 无

返回: 3

输入: inMsisdn = “869“

输出: 无

返回: 0

2. 将一个字符串的元音字母复制到另一个字符串,并排序(30 分)

问题描述:

有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需

要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对

字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在

后,依次有序)。

说明:

1、 元音字母是 a,e,i,o,u,A,E,I,O,U。

2、 筛选出来的元音字母,不需要剔重;

最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。

要求实现函数:

void sortVowel (char* input, char* output);

【输入】 char* input,表示输入的字符串

【输出】 char* output,排好序之后的元音字符串。

【返回】 无

示例

输入:char *input = “Abort!May Be Some Errors In Out System. “

输出:char *output =“aeeeooAEIO “

3. 身份证号码合法性判断

问题描述:

我国公民的身份证号码特点如下:

1、 长度为 18 位;

2、 第 1~17 位只能为数字;

3、 第 18 位可以是数字或者小写英文字母 x。

4、 身份证号码的第 7~14 位表示持有人生日的年、月、日信息。

例如:511002 19880808 0111 或 511002 x。

请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的

年、月、日信息进行校验。年份大于等于 1900 年,小于等于 2100 年。需要考虑

闰年、大小月的情况。所谓闰年,能被 4 整除且不能被 100 整除 或 能被 400

整除的年份,闰年的 2 月份为 29 天,非闰年的 2 月份为 28 天。其他情况的合法

性校验,考生不用考虑。

函数返回值:

1) 如果身份证号合法,返回 0;

2) 如果身份证号长度不合法,返回 1;

3) 如果身份证号第 1~17 位含有非数字的字符,返回 2;

4) 如果身份证号第 18 位既不是数字也不是英文小写字母 x,返回 3;

5) 如果身份证号的年信息非法,返回 4;

6) 如果身份证号的月信息非法,返回 5;

7) 如果身份证号的日信息非法,返回 6(请注意闰年的情况);

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如

果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。

要求实现函数:

int verifyIDCard(char* input)

示例

1) 输入:”511002 111222”,函数返回值:1;

2) 输入:”511002 abc123456789”,函数返回值:2;

3) 输入:”511002 a”,函数返回值:3;

4) 输入:”511002 4”,函数返回值:4;

5) 输入:”511002 4”,函数返回值:5;

6) 输入:”511002 4”,函数返回值:6;

7) 输入:”511002 1989 0229 1234”,函数返回值:7;

8) 输入:”511002 4”,函数返回值:0;

第一个:比较两个数组的元素是否相同

从后向前比较 ,直到比较完较短的一个数组为止。出现不同元素就返

回 0 相同则返回 1

第二题:比较一个数组的元素 是否为回文数组

第三题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组

中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前

第四题:比较汗 求简单的四则运算

第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:

有以下几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不相同数值的牌

4:两对

5:顺子 包括 10,J,Q,K,A

6:什么都不是

第六题:类似昨天 Sara 说的最后一题:

给你一个数组 a[],数组长度 len 以及一个整数 m

从数组中第一个数字数起 找到第 m 个数字 输出 a[m] 然后再将 a[m]赋值给

m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素

全部输出

第一题【20 分】:鉴定回文数组。

第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。

第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3

个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。

【2012】

1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。

#include

#include

#include

#include

int delete_sub_str(const char *str,const char *sub_str,char *result)

{

assert(str != NULL && sub_str != NULL);

const char *p,*q;

char *t,*temp;

p = str;

q = sub_str;

t = result;

int n,count = 0;

n = strlen(q);

temp = (char *)malloc(n+1);

memset(temp,0x00,n+1);

while(*p)

{

memcpy(temp,p,n);

if(strcmp(temp,q) == 0 )

{

count++;

memset(temp,0x00,n+1);

p = p + n;

}

else

{

*t = *p;

p++;

t++;

memset(temp,0x00,n+1);

}

}

free(temp);

return count;

}

int main()

{

char s[100] = {‘0’};

int num = delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s);

printf(“The number of sub_str is %drn”,num);

printf(“The result string is %srn”,s);

}

2、约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号

为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复

下去,直到圆桌周围的人全部出列。

#include

#include

typedef struct Node

{

int num;

struct Node *next;

}LinkList;

LinkList *creat(int n)

{

LinkList *p,*q,*head;

int i=1;

p=(LinkList *)malloc(sizeof(LinkList));

p->num=i;

head=p;

for(i=2;i<=n;i++)

{

q=(LinkList *)malloc(sizeof(LinkList));

q->num=i;

p->next=q;

p=q;

}

p->next=head; /*使链表尾指向链表头 形成循环链表*/

return head;

}

void fun(LinkList *L,int m)

{

int i;

LinkList *p,*s,*q;

p=L;

printf("出列顺序为:");

while(p->next!=p)

{

for(i=1;i

{ q=p;

p=p->next;

}

printf("%5d",p->num);

s=p;

q->next=p->next;

p=p->next;

free(s);

}

printf("%5dn",p->num);

}

int main()

{

LinkList *L;

int n, m;

n=9;

m=5;

L=creat(n);

fun(L,m);

return 0;

}

3、比较一个数组的元素 是否为回文数组

#include

#include

Void huiwen(char str[])

{

int i,len,k=1;

len=strlen(str);

for(i=0;i

{

if(str[i]!=str[len-i-1])

{

k=0;

break;

}

}

if(k==0)

printf("%s 不是一个回文数n",str);

else

printf("%s 是一个回文数n",str);

}

void main()

{

char str[100] = {0};

printf("Input a string:");/*提示Input a string:*/

scanf("%s", str); /*scan()函数输入一个字符串:*/

huiwen(str);

}

4、 数组比较(20分)

• 问题描述:

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组

个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数

比如:

数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3

• 要求实现函数:

int array_compare(int len1, int array1[], int len2, int array2[])

【输入】 int len1:输入被比较数组1的元素个数;

int array1[]:输入被比较数组1;

int len2:输入被比较数组2的元素个数;

int array2[]:输入被比较数组2;

【输出】 无

【返回】 不相等元素的个数,类型为int

• 示例

1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5

函数返回:0

2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6

函数返回:3

#include

#include

#include

int array_compare(int len1, int array1[], int len2, int array2[])

{

int count=0;

for( ;len1>=0&&len2>=0 ;len1--,len2--)

{

if(array1[len1-1]==array2[len2-1])

{

count++;

}

}

return count;

}

int main()

{

int result=0;

int array1[]={1,3,5};

int len1=3;

int array2[]={77,12,1,3,5};

int len2=5;

result=array_compare( len1, array1, len2, array2); ///result=array_compare( len1, array1[],

len2, array2[]);不能这样,函数形参中永远只是传得首地址,不能传数组切记!!

printf("the result is %d", result);

}

#include //written by myself

#include

int array_compare(int len1,int array1[],int len2,int array2[]);

int main()

{

int arr1[] = {1,3,5};

int arr2[] = {77,21,1,3,5,7};

int len1 = 0,len2 = 0;

len1 = sizeof(arr1)/sizeof(int);

len2 = sizeof(arr2)/sizeof(int);

printf("%d %dn",len1,len2);

printf("%d",array_compare(len1,arr1,len2,arr2));

return 0;

}

int array_compare(int len1,int array1[],int len2,int array2[])

{

int num = 0;

int i = 0,j = 0;

for(i = len1 - 1,j = len2 - 1;i >= 0 && j >= 0;i--,j--)

if(array1[i] != array2[j])

num++;

return num;

}

/*int array_compare(int len1, int array1[], int len2, int array2[])

{

if(len1 == len2) {

int count = 0;

for (int i=0;i

{

if(array1[i]!=array2[i]) count++;

}

return count;

} else if(len1

return array_compare(len1,array1,len1,array2+len2-len1);

} else {

return array_compare(len2,array1+len1-len2,len2,array2);

}

}*/

#include //另一种算法

int compare_array(int len1,int array1[],int len2,int array2[])

{

int i,t,small,num=0;

//把ã?两¢?数ºy组Á¨¦倒Ì1置?

for(i=0;i

{

t=array1[i];

array1[i]=array1[len1-i-1];

array1[len1-i-1]=t;

}

for(i=0;i

{

t=array2[i];

array2[i]=array2[len2-i-1];

array2[len2-i-1]=t;

}

/* for(i=0;i

printf("%d ",array1[i]);

printf("n");

for(i=0;i

printf("%d ",array2[i]);

*/ printf("n");

if(len1>len2)

small=len2;

else

small=len1;

num=small;

for(i=0;i

{

if(array1[i]==array2[i])

num--;

}

printf("num=%dn",num);

return num;

}

void main()

{

int array1[5]={77,21,1,3,5},array2[3]={1,3,5};

int len1=5,len2=3;

compare_array(len1,array1,len2,array2);

}

5、约瑟夫问题

• 问题描述:

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始

计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直

到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时

输出数值出列的顺序

比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)

第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数

第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数

第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数

最后一轮计数出列数字为4,计数过程完成。

输出数值出列顺序为:2,3,1,4。

• 要求实现函数:

void array_iterate(int len, int input_array[], int m, int output_array[])

【输入】 int len:输入数列的长度;

int intput_array[]:输入的初始数列

int m:初始计数值

【输出】 int output_array[]:输出的数值出列顺序

【返回】 无

• 示例

输入:int input_array[] = {3,1,2,4},int len = 4,

m=7

输出:output_array[] = {2,3,1,4}

////////////循环链表实现//////////////////////

#include

#include

#include

typedef struct Node

{

int num;

struct Node *next; //结构体定义时注意大小写一致

} node;

node *creat(int len , int input_array[])

{

node *h,*s,*p;

int i;

h=(node*)malloc(sizeof(node));

h->num=input_array[0];

p=h;

for(i=1;i

{

s=(node*)malloc(sizeof(node));

s->num=input_array[i];

p->next=s;

p=s;

}

p->next=h;

return (h);

}

void array_iterate(int len, int input_array[], int m, int output_array)

{

node *q,*p,*s;

int i=0,j=0,k;

p=creat(len,input_array);

while(p->next!=p)

{

for(i=1;i

{

q=p;

p=p->next;

}

m=p->num;

printf("%5d",m);

output_array[j++]=m;

s=p;

q->next=p->next;

p=p->next;

free(s);

s=NULL;

}

m=p->num;

printf("%5dn",m);

output_array[j]=p->num;

k=j;

// for(j=0 ; j<=k; j++)

// { printf("%5d",output_array[j]);}

}

int main()

{

int input_array[]={3,1,2,4};

int len=4;

int m=7;

int output_array[4];

array_iterate(len, input_array, m, output_array);

}

6、 手机号码合法性判断(20分)

 问题描述:

我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:86。特点如下:

1、 长度13位;

2、 以86的国家码打头;

3、 手机号码的每一位都是数字。

请实现手机号码合法性判断的函数要求:

1) 如果手机号码合法,返回0;

2) 如果手机号码长度不合法,返回1

3) 如果手机号码中包含非数字的字符,返回2;

4) 如果手机号码不是以86打头的,返回3;

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1

即可,不需要再做其他合法性判断。

 要求实现函数:

int verifyMsisdn(char* inMsisdn)

【输入】 char* inMsisdn,表示输入的手机号码字符串。

【输出】 无

【返回】 判断的结果,类型为int。

 示例

输入: inMsisdn = “869123456789“

输出: 无 返回: 1

输入: inMsisdn = “889“

输出: 无 返回: 3

输入: inMsisdn = “869“

输出: 无 返回: 0

#include

#include

#include

#include

#define LENGTH 13

int verifyMsisdn(char *inMsisdn)

{

char *pchar=NULL;

assert(inMsisdn!=NULL);

if(LENGTH==strlen(inMsisdn))

{

if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6'))

{

while(*inMsisdn!='0')

{

if((*inMsisdn>='0')&&(*inMsisdn<='9'))

inMsisdn++;

else

return 2 ;

}

}

else

return 3;

}

else

return 1;

return 0;

}

int main()

{

char *pchar=NULL;

unsigned char ichar=0;

int result;

switch(ichar)

{

case 0: pchar="86";break;

case 1: pchar="8611";break;

case 2: pchar="86s1234536366"; break;

default: break;

}

result =verifyMsisdn(pchar);

printf("result is %dn",result);

}

???多看7、简单四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的

注: 1、表达式只含 +, -, *, / 四则运算符,不含括号

2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的

计算优先级

4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字

符,不会出现计算溢出情况

• 要求实现函数:

int calculate(int len,char *expStr)

【输入】 int len: 字符串长度;

char *expStr: 表达式字符串;

【输出】 无

【返回】 计算结果

• 示例

1) 输入:char *expStr = “1+4*5-8/3” 返回:19

2) 输入:char *expStr = “8/3*3” 函数返回:6

#include

using namespace std;

int calculate(int len,char *expStr)

{

struct {

char opdata[200];

int top;

}opstack;

//定义操作符栈

= -1;

int i=0;//遍历字符串的下标

int t=0;//当前后缀表达式的长度

char ch = expStr[i];

while (ch!='0')

{

switch (ch)

{

case '+': case '-':

while ( != -1)

{

expStr[t] = [];

--;

t++;

}

++;

[] = ch;

break;

case '*': case '/':

while ( != -1 && ([] =='*' || []

=='/') )

{

expStr[t] = [];

--;

t++;

}

++;

[] = ch;

break;

default: expStr[t] = ch;

t++;

break;

}

i++;

ch = expStr[i];

}

while ( != -1)//将栈中所有的剩余的运算符出栈

{

expStr[t] = [];

--;

t++;

}

expStr[t]='0';

struct {

int numeric[200];

int top;

}data;

= -1;

i=0;

ch = expStr[i];

while (ch!='0')

{

if (ch>='0' && ch <= '9' )

{

++;

c[] = ch-'0';

}

else if('+' == ch)

{

int tmp = c[-1]+c [da ];

--;

c[] = tmp;

}

else if('-' == ch)

{

int tmp = c[-1]-c [da ];

--;

c[] = tmp;

}

else if('*' == ch)

{

int tmp = c[-1]*c [da ];

--;

c[] = tmp;

}

else if('/' == ch)

{

if(c[] == 0)

{

printf("cannot be zero of the dividen");

exit(1);

}

int tmp = c[-1]/c [da ];

--;

c[] = tmp;

}

i++;

ch = expStr[i];

}

return c[];

}

void main()

{

char expStr[] = "8/3*3";

printf("%s = ",expStr);

int result = calculate(strlen(expStr),expStr);

printf("%dn",result);

}

8、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与

score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表

示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家

评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。

函数最终返回选手得分。 函数接口 int cal_score(int score[], int judge_type[], int n)

#include

#include

#include

#include

#define N 5

int cal_score(int score[], int judge_type[], int n)

{

int expert=0;

int dazhong=0;

int zongfen=0;

int i;

int number=0;

for(i=0;i

{

if(judge_type[i]==1)

{

expert=expert+score[i];

number++;

}

else dazhong=dazhong+score[i];

}

if(number==N)

{

zongfen=(int)(expert/N);

}

Else

{

expert=(int)(expert/number); dazhong=(int)(dazhong/(N-number));

zongfen=int(0.6*expert+0.4*dazhong);

}

return zongfen;

}

int main()

{

int score[N];

int judge_type[N];

int numberlast=0;

int i;

printf("please input the %d score:n",N);

for(i=0;i

scanf("%d",&score[i]);

printf("please input the level(1:expert,2:dazhong)n ");

for(i=0;i

scanf("%d",&judge_type[i]); numberlast=cal_score(score,judge_type,N);

score is %dn",numberlast);

return 0;

}

#include //written by myself

#include

#include

#include

using namespace std;

#define N 5

int cal_score(int score[],int judge_type[],int n);

int main()

{

int score[N] = {99,95,93,87,80};

int judge_type[N] = {2,1,2,1,1};

cal_score(score,judge_type,N);

return 0;

}

int cal_score(int score[],int judge_type[],int n)

{

int sum = 0;

int aver1 = 0,aver2 = 0;

int j = 0,k = 0;

for(int i = 0;i < n;i++)

{

printf("the last

if(judge_type[i] == 1)

{

aver1 += score[i];

j++;

}

else if(judge_type[i] == 2)

{

aver2 += score[i];

k++;

}

}

aver1 = aver1 /j;

aver2 = aver2 /k;

sum = aver1 * 0.6 + aver2 * 0.4;

printf("%d %d %dn",aver1,aver2,sum);

return sum;

}

9、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,

如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从

大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

Eg:input[] = {3, 6, 1, 9, 7},output[] = {3, 7, 9, 6, 1};

input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}

#include

#include

#include

void sort(int input[], int n, int output[])

{

int i,j;

int k=1;

int temp;

int med;

for(i=0;i

for(j=0;j

if(input[j]>input[j+1]) {temp=input[j];input[j]=input[j+1];input[j+1]=temp;}

if(n%2!=0)

{

for(i=0;i

printf("%2d",input[i]);

printf("n");

med=(n-1)/2;

output[med]=input[n-1];

for(i=1;i<=med;i++)

{

output[med-i]=input[n-1-k];

output[med+i]=input[n-2-k];

k=k+2;

}

}

else

{

for(i=0;i

printf("%2d",input[i]);

printf("n");

med=n/2;

output[med]=input[n-1];

for(i=1;i<=med-1;i++)

{

output[med-i]=input[n-1-k];

output[med+i]=input[n-2-k];

k=k+2;

}

output[0]=input[0];

}

for(i=0;i

printf("%2d",output[i]);

printf("n");

}

int main()

{

int a[6]={3,6,1,9,7,8};

int b[6]={0};

for(int i=0;i<6;i++)

printf("%2d",a[i]);

printf("n");

sort(a,6,b);

return 0;

}

#include //written by myself

#include

#include

void sort(int input[],int n,int output[]);

int main()

{

int input[] = {3,6,1,9,7,8};

int output[6]; //长度根据输入数组的长度改变

int len = 0;

len = sizeof(input)/sizeof(int);

for(int i = 0;i < len;i++)

printf("%d ",input[i]);

printf("n");

sort(input,len,output);

return 0;

}

void sort(int input[],int n,int output[])

{

int i = 0,j = 0;

int tmp = input[0];

for(i = 0;i < n - 1;i++)

for(j = i + 1;j < n;j++)

{

if(input[i] < input[j])

{ tmp = input[i];input[i] = input[j];input[j] = tmp; }

}

for(int i = 0;i < n;i++)

printf("%d ",input[i]);

printf("n");

if(n % 2 == 0)

{

for(i = 0;i < n;i++)

{

if(i % 2 == 0)

output[n/2 + i/2] = input[i];

else if(i % 2 == 1)

output[n/2 - (i+1)/2] = input[i];

}

}

else if(n % 2 == 1)

{

for(i = 0;i < n;i++)

{

if(i % 2 == 0)

output[(n-1)/2 + i/2] = input[i];

else if(i % 2 == 1)

output[(n-1)/2 - (i+1)/2] = input[i];

}

}

for(int i = 0;i < n;i++)

printf("%d ",output[i]);

printf("n");

}

10、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户

任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,

task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务

按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[]

数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。

例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}

system_task[] = {0, 3, 1, 7, -1}

user_task[] = {4, 8, 2, 6, -1}

函数接口void scheduler(int task[], int n, int system_task[], int user_task[])

#include

#include

#include

#include

void scheduler1(int task[], int n, int system_task[], int user_task[])

{

int i;

int j=0;

int *p,*pp,*p_user,*pp_user;

int index=0;

int count,count2;

int min=0;

int k=0;

p=(int*)malloc(sizeof(int)*n);

for(i=0;i

p[i]=0;

pp=(int*)malloc(sizeof(int)*n);

for(i=0;i

pp[i]=0;

p_user=(int*)malloc(sizeof(int)*n);

for(i=0;i

p_user[i]=0;

pp_user=(int*)malloc(sizeof(int)*n);

for(i=0;i

pp_user[i]=0;

for(i=0;i

{

if(task[i]<50)

{

{

system_task[j]=task[i];

pp[j]=i;

j++;

}

count=j;

}

else if(task[i]<=255)

{

{

user_task[k]=task[i];

pp_user[k]=i;

k++;

}

count2=k;

}

else task[i]=task[i];

}

for(i=0;i

printf("%3d",system_task[i]);

printf("n");

for(i=0;i

{

min=system_task[0];

for(j=1;j

{

if(system_task[j]

{

min=system_task[j];

p[i]=j;

}

}

system_task[p[i]]=51;

}

pp[count]=-1;

for(i=0;i

printf("%3d",pp[p[i]]);

printf("%3dn",pp[count]);

/***********************************************/

for(i=0;i

printf("%4d",user_task[i]);

printf("n");

for(i=0;i

{

min=user_task[0];

for(j=1;j

{

if(user_task[j]

{

min=user_task[j];

p_user[i]=j;

}

}

user_task[p_user[i]]=256;

}

pp_user[count2]=-1;

for(i=0;i

printf("%4d",pp_user[p_user[i]]);

printf("%3dn",pp_user[count2]);

}

int main()

{

int task[9]={0, 30, 155, 1, 80, 300,170, 40, 99};

int system_task[9]={0};

int user_task[9]={0};

scheduler1(task,9,system_task,user_task);

return 0;

}

#include //written by myself

#include

#include

void scheduler(int task[],int n,int system_task[],int user_task[]);

int main()

{

int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};

int system_task[9];

int user_task[9];

int n = 9;

scheduler(task,n,system_task,user_task);

return 0;

}

void scheduler(int task[],int n,int system_task[],int user_task[])

{

int i = 0;

int j = 0,k = 0;

int len1 = 0,len2 = 0;

int tmp = 0;

for(i = 0;i < n;i++)

{

if(task[i] < 50)

{

system_task[j++] = i;

len1 = j;

}

else if(task[i] >= 50 && task[i] <= 255)

{

user_task[k++] = i;

len2 = k;

}

}

for(i = 0;i < len1 - 1;i++)

for(j = i + 1;j < len1;j++)

{

if(task[system_task[i]] > task[system_task[j]])

{

tmp = system_task[i];

system_task[i] = system_task[j];

system_task[j] = tmp;

}

}

system_task[len1] = -1;

for(i = 0;i < len1 - 1;i++)

for(j = i + 1;j < len1;j++)

{

if(task[user_task[i]] > task[user_task[j]])

{

tmp = user_task[i];

user_task[i] = user_task[j];

user_task[j] = tmp;

}

}

user_task[len2] = -1;

for(i = 0;i < len1 + 1;i++)

{

printf("%d ",system_task[i]);

}

printf("n");

for(i = 0;i < len2 + 1;i++)

{

printf("%d ",user_task[i]);

}

}

11、输入一个字符串,用指针求出字符串的长度。

#include

int main()

{

char str[20], *p;

int length=0;

printf(“Please input a string: ”);

gets(str);

p=str;

while(*p++)

{

length++;

}

printf(“The length of string is %dn”, length);

return 0;

}

12、使用C语言实现字符串中子字符串的替换

描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),

strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。

举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符

串,结果就变成了:

ABCDEFGHIJKLMNOPQgggUVWXYZ

答案一:

#include

#include

void StrReplace(char* strSrc, char* strFind, char* strReplace);

#define M 100;

void main()

{char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char s1[]="RST";

char s2[]="ggg";

StrReplace(s,s1,s2);

printf("%sn",s);

}

void StrReplace(char* strSrc, char* strFind, char* strReplace)

{

int i=0;

int j;

int n=strlen(strSrc);

int k=strlen(strFind);

for(i=0;i

{

if(*(strSrc+i)==*strFind)

{

for(j=0;j

{

if(*(strSrc+i+j)==*(strFind+j))

*(strSrc+i+j)=*(strReplace+j);

else continue;

}

}

}

}

答案二:

#include

#define MAX 100

Void StrReplace(char *s, char *s1, char *s2) {

char *p;

for(; *s; s++) {

for(p = s1; *p && *p != *s; p++);

if(*p) *s = *(p - s1 + s2);

}

} //perfect !!

int main()

{

char s[MAX]; //s是原字符串

char s1[MAX], s2[MAX]; //s1是要替换的

//s2是替换字符串

puts("Please input the string for s:");

scanf("%s", s);

puts("Please input the string for s1:");

scanf("%s", s1);

puts("Please input the string for s2:");

scanf("%s", s2);

StrReplace(s, s1, s2);

puts("The string of s after displace is:");

printf("%sn", s);

return 0;

}

答案三:

#include

#include

#include

#define M 100

void StrReplace(char* strSrc, char* strFind, char* strReplace);

int main()

{

char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char s1[]="RST";

char s2[]="ggg";

StrReplace(s,s1,s2);

printf("%sn",s);

return 0;

}

void StrReplace(char* strSrc, char* strFind, char* strReplace)

{

while(*strSrc != '0')

{

if(*strSrc == *strFind)

{

if(strncmp(strSrc,strFind,strlen(strFind)) == 0 )

{

int i = strlen(strFind);

int j = strlen(strReplace);

printf("i = %d,j = %dn",i,j);

char *q = strSrc + i;

printf("*q = %sn",q);

//while((*strSrc++ = *strReplace++) != '0');替换为:

for(int k = 0;k < j;k++)

{

*(strSrc+k) = *(strReplace+k);

}

for(int k = 0;k < j;k++)

{ *strSrc++; }

printf("strSrc - 1 = %sn",strSrc-1 );

printf("*q = %sn",q);

//while((*strSrc++ = *q++) != '0');该句删除

}

else strSrc++;

}

else strSrc++;

}

}

13、编写一个程序实现功能:将字符串”Computer Secience”赋给一个字符数组,然后从第一个字母开始间隔的

输出该串,用指针完成。

答案:

#include

#include

int main()

{

char str[]=”Computer Science”;

int flag=1;

char *p=str;

while(*p)

{

if ( flag )

{ printf(“%c”,*p); }

flag = (flag + 1) % 2;

p++;

}

printf(“n”);

return 0;

}

#include //written by myself

#include

#include

int main()

{

char str[] = "Computer Secience";

char *p = str;

while(*(p - 1))

{

printf("%c",*p++);

p++;

}

printf("n");

return 0;

}

14、编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。

char str1[20]={“Hello ”}, str2[20]={“World ”};

答案:

#include

int main()

{

char str1[20]={“Hello ”}, str2[20]={“World ”};

char *p=str1, *q=str2;

while( *p ) p++;

while( *q )

{

*p = *q;

p++;

q++;

}

*p = ‘0’; //注意字符串结尾的标志

printf(“%sn”, str1);

return 0;

}

15、算分数的问题,去掉一个最高分一个最低分,求平均分

#include

float avescore(float score[],int n)

{

float min=0;

float max=0;

int minindex=0;

int maxindex=0;

float sum=0;

min=score[0];

for(int i=0;i

if(score[i]

{

min=score[i];

minindex=i;

}

score[minindex]=0;

max=score[0];

for(i=0;i

if(score[i]>max)

{ max=score[i]; maxindex=i; }

score[maxindex]=0;

for(i=0;i

sum+=score[i];

sum=sum/(n-2);

return sum;

}

void main()

{

float score[6]={70,80,90,98,87,86};

float lastscore;

lastscore=avescore(score,6);

printf("the last score is :%5.2fn",lastscore);

}

运行结果:the last score is :85.75

#include //written by myself

#include

#include

#define M 6

float aver(float *score,int n);

int main()

{

float score[M] = {70,80,90,98,87,86};//{9,8,7,6,8,9,7,8,9,10};

printf("%fn",aver(score,M));

return 0;

}

float aver(float score[],int n)

{

float max = score[0],min = score[0];

for(int i = 1;i < n;i++)

if(max <= score[i])

max = score[i];

for(int i = 1;i < n;i++)

if(score[i] <= min)

min = score[i];

float aver = 0;

for(int i = 0;i < n;i++)

aver += score[i];

aver = aver - max - min;

aver /= n - 2;

return aver;

}

16、对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇

数 若奇数和偶数不等长,则把剩下的直接放到数组中。

思路:先进行奇偶判断,得到奇数和偶数数组。然后对两数组排序,进行长度判断,最后组织数据。

#include

#include

void jiou(int a[],int n)

{

int *p1;

int *p2;

int i,j;

int k=0;

int kk=0;

int count1=0;

int count2=0;

int temp;

int temp2;

int m=0;

p1=(int*)malloc(sizeof(int)*n);

p2=(int*)malloc(sizeof(int)*n);

for(i=0;i

{

p1[i]=0;

p2[i]=0;

}

for(i=0;i

{

if((a[i]%2)!=0)

{p2[kk++]=a[i];}

else

{p1[k++]=a[i];}

}

count1=k;

count2=kk;

for(i=0;i

printf("%3d",p2[i]);

printf("n");

for(i=0;i

for(j=0;j

if(p2[j]>p2[j+1])

{temp2=p2[j];p2[j]=p2[j+1];p2[j+1]=temp2;}

for(i=0;i

printf("%3d",p2[i]);

printf("n");

for(i=0;i

printf("%3d",p1[i]);

printf("n");

for(j=0;j

if(p1[j]

{temp=p1[j];p1[j]=p1[j+1];p1[j+1]=temp;}

for(i=0;i

printf("%3d",p1[i]);

printf("n");

if(count1>count2)

{

for(i=0;i

{

a[i+m]=p2[i];

a[i+1+m]=p1[i];

m=m+1;

}

for(i=0;i

a[2*count2+i]=p1[i+count2];

}

else

{

for(i=0;i

{

a[i+m]=p2[i];

a[i+1+m]=p1[i];

m=m+1;

}

for(i=0;i

a[2*count1+i]=p2[i+count1];

}

for(i=0;i

for(i=0;i

printf("%3d",a[i]);

printf("%n"); } void main()

{

int a[10]={2,3,14,6,2,15,12,14,4,11}; jiou(a,10);

}

运行结果:

3 15 11

3 11 15

2 14 6 2 12 14 4

14 14 12 6 4 2 2

3 14 11 14 15 12 6 4 2 2

#include

#include

#define M 10

void sort(int arr[],int n);

int main()

{

int arr[M] = {7,3,14,6,5,15,12,1,4,11};

sort(arr,M);

return 0;

}

void sort(int arr[],int n)

{

int *odd,*even;

odd = (int *)malloc(sizeof(int) * n);

even = (int *)malloc(sizeof(int) * n);

int len1 = 0,len2 = 0;

int j = 0,k = 0;

for(int i = 0;i < n;i++)

{

if(arr[i] % 2 != 0) odd[len2++] = arr[i];

else even[len1++] = arr[i];

}

printf("%d %dn",len1,len2); //len1是数组even的长度¨,len2是odd的长度

for(j = 0;j < len1 - 1;j++)

for(k = j + 1;k < len1 ;k++)

{

if( even[j] <= even[k])

{ int tmp = even[j];even[j] = even[k];even[k] = tmp; }

}

for(j = 0;j < len2 - 1;j++)

for(k = j + 1;k < len2 ;k++)

{

if( odd[j] >= odd[k])

{ int tmp = odd[j];odd[j] = odd[k]; odd[k] = tmp; }

}

for(int i = 0;i < len1;i++) printf("%d,",even[i]); printf("n");

for(int i = 0;i < len2;i++) printf("%d,",odd[i]); printf("n"); //len1是数组even的长度¨,

len2是odd的长度

if(len1 <= len2)

{

for(int j = 0;j < len1;j++)

{

arr[2*j] = odd[j]; //注意数组的存储方式,尤其是剩余段起始下标的选取

arr[2*j+1] = even[j];

}

for(int j = len1,k = 2 * j;k < n,j < len2;j++)

{ arr[k++] = odd[j]; }

}

else

{

for(int j = 0;j < len2;j++)

{

arr[2*j] = odd[j];

arr[2*j+1] = even[j];

}

for(int j = len2,k = 2 * j;k < n,j < len1;j++)

{ arr[k++] = even[j]; }

}

for(int i = 0;i < n;i++) printf("%d,",arr[i]);

}

1、如何从一个字符串中找出整数并将其以数字的形式输出;

2、如何做IP地址匹配,给出一个IP地址1和子网掩码,然后再给一个IP地址2,判断IP地址1和IP地址2是

不是同一个子网。

【2013】

题目描述:

通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自

动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。

如果输入“abc def gh i d”,结果将是abc,def,gh,i,d,

要求实现函数:

void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 输入字符串

lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例

输入:“abc def gh i d”

输出:“abc,def,gh,i,d,”

long j = 0;

for(long i=0;i

{

if(pInputStr[i]!=’ ’)

{

pOutputStr[j]= pInputStr[i];

j++;

}

else

{

If(pOutputStr[j-1] != ’,’)

{

pOutputStr[j]=’,’;

j++;

}

}

}

C_C++_CY_01. 逆序链表输出。

题目描述:

将输入的一个单向链表,逆序后输出链表中的值。链表定义如下:

typedef struct tagListNode

{

int value;

struct tagListNode *next;

}ListNode;

要求实现函数:

void converse(ListNode **head);

【输入】head: 链表头节点,空间已经开辟好

【输出】head: 逆序后的链表头节点

【返回】无

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例

输入:链表 1->2->3->4->5 的头节点head

输出:链表 5->4->3->2->1 的头节点head

{

ListNode *p = new ListNode;

ListNode *q = new ListNode;

ListNode *t = new ListNode;

p = *head;

q = p ->next;

t = NULL;

while(q != NULL)

{

t =q->next;

q->next = p;

p = q;

q = t;

}

*head = q;

delete p;

delete q;

delete t;

}

【2014】

1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一

个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50

#include main()

{ int min_num=num[0];

int num[50]={0}; int max_num=num[0];

int i,n; for(int j=0;j

{

printf("请输入整型数组的长度(1~50):"); if(max_num

scanf("%d",&n); max_num=num[j];

else if(min_num>num[j])

printf("请输入整型数组的元素:"); min_num=num[j];

for (i=0;i

{ int sum=min_num+max_num;

scanf("%d",&num[i]); printf("数组中最大与最小值之和:%dn",sum);

} return 0;

}

2.求两个长长整型的数据的和并输出,例如输入33333 。。。 311.。。。,则输

出。。。。

#include if(len_num1>0)

#include {

#include sum[len_max--]=num1[len_num1 - 1 ]-'0';

main() len_num1--;

{ }

char *num1,*num2; //两个长长整型数据 if(len_num2>0)

char *sum; {

// int temp; sum[len_max--]=num1[len_num2 - 1]-'0';

int len_num1,len_num2; // 两个长长整型数据的长度 len_num2--;

int len_max,len_min; }

num1=(char*)malloc(sizeof(char)); for(int j=len_max1;j>=0;j--) //实现进位操作

num2=(char*)malloc(sizeof(char)); {

printf("输入两个长长整型数据:"); // temp=sum[j]-'0';

scanf("%s",num1); if(sum[j]>=10)

printf("输入两个长长整型数据:"); {

scanf("%s",num2); sum[j-1]+=sum[j]/10;

len_num1=strlen(num1); sum[j]%=10;

len_num2=strlen(num2); }

len_max=(len_num1>=len_num2)? }

len_num1:len_num2; char

len_min=(len_num1<=len_num2)? *outsum=(char*)malloc(sizeof(char)*len_max1);

len_num1:len_num2; j=0;

int len_max1=len_max; while(sum[j]==0) //跳出头部0元素

sum=(char*)malloc(sizeof(char)*len_max); j++;

memset(sum,0x00,len_max+1);//切忌初始化 for(int m=0;m

for(;len_num1>0&&len_num2>0;len_num1--,len_ outsum[m]=sum[j]+'0';

num2--) outsum[m]='0';

{ printf("输出两长长整型数据之

sum[len_max--]=((num1[len_num1-1]-'0')+(num和:%sn",outsum);

2[len_num2-1]-'0')); return 0;

} }

3.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,

将非首次出现的字符过滤掉。

比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:

void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 输入字符串

lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

#include

#include

#include

void stringFilter(const char *p_str, long len, char *p_outstr)

{

int array[256]={0};

const char *tmp = p_str;

for(int j=0;j

{

if(array[tmp[j]]==0)

*p_outstr++= tmp[j];

array[tmp[j]]++;

}

*p_outstr = '0';

}

void main()

{

char *str = "cccddecc";

int len = strlen(str);

char * outstr = (char *)malloc(len*sizeof(char));

stringFilter(str,len,outstr);

printf("%sn",outstr);

free(outstr);

outstr = NULL;

}

4.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母

进行压缩,并输出压缩后的字符串。

压缩规则:

1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".

2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

要求实现函数:

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 输入字符串

lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

#include #include

#include