阅读644 返回首页    go 阿里云 go 技术社区[云栖]


中兴笔试题

下面这段代码的输出是多少(在32位机上).char *p;//指针char *q[20];//指针数组char *m[20][20];//二维指针数组int (*n)[10]; // 这是行指针struct MyStruct{char dda;double dda1;int type ;};MyStruct k;printf(“%d %d %d %d”,sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));答案:4,80,1600,4,24(1)char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };for(int i=0;i<12;i++)printf(“%d “,__a[0][0]_); // a[0][0][i]在空格处填上合适的语句,顺序打印出a中的数字(2)char **p, a[16][8];问:p=a是否会导致程序在以后出现问题?为什么?答:没有问题,只是使用时要小心,p是指向指针的指针。3.用递归方式,非递归方式写函数将一个字符串反转.函数原型如下:char *reverse(char *str);答:
// 非递归实现字符串反转
char *Reverse(char *str)
{
	int len = strlen(str);
	char temp;

    for (int i = 0, j = len - 1; i <= len / 2; ++i, --j)
    {
		temp = str[i];
        str[i] = str[j];
		str[j] = temp;
    }

	return str;
}

// 递归实现字符串反转
char *Reverse_Recur(char *str)
{
	if (str == NULL)
	{
		return NULL;
	}

	static int len = strlen(str);
	static int pre = 0;
	static int post = len - 1;

	char temp = str[pre];
    str[pre++] = str[post];
    str[post--] = temp;

	if (pre <= post) // 未到达中点,则递归
	    Reverse_Recur(str);
	return str;
}4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?答:strcpy函数:拷贝字符串memcpy函数:拷贝任何数据
使用strcpy函数时,需要注意目的串与原字符串的长度的问题,应该要保证目标串的长度大于或者等于原字符串的长度
使用memcpy函数时,需要指定拷贝的字符串的长度,指定的长度必须保证小于目标串的长度5.写一个函数将一个链表逆序.答:
// 链表逆序
void ReverseLinkList(LinkList L)
{
	if (L->next == NULL || L == NULL)	return;
	LinkList p = L->next;
	LinkList q = NULL;

	if (p->next != NULL)
	{
		q = p->next;
	}

	L->next = NULL;

	while (p != NULL)
	{
        p->next = L->next;
		L->next = p;
		p = q;
		if (q != NULL)
		{
			q = q->next;
		}	
	}
}6一个单链表,不知道长度,写一个函数快速找到中间节点的位置.答:
// 未知单链表表长,查找中间结点的位置
LinkList FindMiddle(LinkList L)
{
	if(L == NULL || L->next == NULL){
		return NULL;
	}
    vector<LinkList> v;
	LinkList p = L->next;
	while (p != NULL)
	{
		v.push_back(p);
		p = p->next;
	}
	return v.at((v.end() - v.begin()) / 2);
}
7 写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).答:LinkList GetLastNListNode(LinkList L, int n)
{

	if(L == NULL || L->next == NULL){
		return NULL;
	}

	vector<LinkList> v;

	LinkList p = L->next;

	while (p != NULL)
	{
		v.push_back(p);
		p = p->next;
	}

	return v.at(v.end() - v.begin() - n);
}
8补充一题:给你一个单向链表的头指针,可能最后不是NULL终止,而是循环链表。题目问你怎么找出这个链表循环部分的第一个节点。比如下面的链表:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 循环,就应该返回结点3的位置。当然尽量用少的空间和时间是题目的要求。答:10.判断链表是否循环;答:bool IsLoopList(LinkNode *head){LinkNode *p1= head,*p2= head;if(head ->next==NULL)//只包含头节点,且头节点的next为NULL说明肯定不是循环链表return false;do{p1=p1->next; //步长为1p2=p2->next->next; //步长为2}while(p2 && p2->next && p1!=p2);if(p1==p2)return true;elsereturn false;}11.用递归算法判断数组a[N]是否为一个递增数组。答:递归算法:#include <stdio.h>#include <conio.h>#define N 5int Judgment(int a[]);int main(){int a[N], i, flag = 1;printf(“Enter array data: “);for (i = 0; i < N; i++){scanf(“%d”, &a); //输入数组元素。}flag = Judgment(a); //调用递归函数if (flag == 1){printf(“increment array.\n”);}else if (flag == 0){printf(“no increment array.\n”);}getch();return 0;}int Judgment(int a[]){static i = 0; //注意这个是静态变量,必须用staticif(i < N – 1){if (a > a[i + 1]){return 0;}i++;Judgment(a);}return 1;}非递归算法:#include <stdio.h>#include <conio.h>#define N 5int Judgment(int a[], int num);int main(){int a[N], i, flag = 1;printf(“Enter array data: “);for (i = 0; i < N; i++){scanf(“%d”, &a);}flag = Judgment(a, N);if (flag == 1){printf(“increment array.\n”);}else if (flag == 0){printf(“no increment array.\n”);}getch();return 0;}int Judgment(int a[], int num){static i = 0, flag = 1;for(i=0; i<num; i++){if (a >= a[i+1]) //假如发现哪两个不是递增,立刻跳出;{flag = 0;break;}}return flag;} 

最后更新:2017-04-03 15:21:46

  上一篇:go C# 网络编程之webBrowser乱码问题及解决知识
  下一篇:go android设置全屏壁纸代码