閱讀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設置全屏壁紙代碼