華為部分線上測試題

xiaoxilang發表於2019-01-01
// huaweiDemo2.cpp: 定義控制檯應用程式的入口點:平臺-VS2017,2019-01-01
//
//1-問題:就算串長度
//輸入一個字串,用指標求出字串的長度。
/*
#include "stdafx.h"
#include "stdio.h"
int main()
{
	char str[20], *p;
	int length = 0;
	printf("Please input a string : ");
	scanf("%s", str);// gets(str);
	p = str;
	while (*p++)
	{
		length++;
	}
	printf("The length of string is %d\n", length);
	scanf("%s", str);//
    return 0;
}
*/

//2-問題:查詢並替換子串
//使用C語言實現字串中子字串的替換
/*
#include "stdafx.h"
#include "stdio.h"
#include <string.h>
void StrReplace(char* strSrc, char* strFind, char* strReplace);
#define M 100;
int main()
{
	char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	char s1[] = "RST";
	char s2[] = "ggg";
	printf("%s\n", s);
	StrReplace(s, s1, s2);
	printf("%s\n", s);
	scanf("%s",s);//顯示
	return 0;
}
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<n; i++)
	{
		if (*(strSrc + i) == *strFind)
		{
			for (j = 0; j<k; j++)
			{
				if (*(strSrc + i + j) == *(strFind + j))
				{
					*(strSrc + i + j) = *(strReplace + j);
				}
				else continue;
			}
		}
	}
}
*/
//3-問題:間隔輸出串
//編寫一個程式實現功能:將字串”Computer Secience”賦給一個字元陣列,然後從第一個字母開始間隔的輸出該串,用指標完成。
/*
#include "stdafx.h"
#include "stdio.h"
#include <string.h>
int main()
{
	char s[] = "Computer Secience";
	char *str=s;
	int flag_t = 1;
	while(*str)
	{
		if (flag_t)
		{
			printf("%c",*str);
		}
		flag_t = (flag_t + 1) % 2;
		str++;
	}
	scanf("%d",flag_t);
		return 0;
}
*/
//4問題:拼串
//編寫一個程式實現功能:將兩個字串合併為一個字串並且輸出,用指標實現。char str1[20] = { “Hello ” }, str2[20] = { “World ” };
/*
#include "stdafx.h"
#include <stdio.h>
int main()
{
	char str1[60] = { "Hello " }, str2[40] = { "World!" },str3[30] = {" Welcome to C world!"};
	char *p = str1, *q1 = str2,*q2=str3;
	while (*p) //str1和p都指向同一個地址,利用p來操作-修改str1
		p++;
	while (*q1)
	{
		*p = *q1;
		p++;
		q1++;
	}
	while (*q2)
	{
		*p = *q2;
		p++;
		q2++;
	}
	*p = '\0';
	printf("%s\n", str1); //str1和p都指向同一個地址,修改p即修改str1

	scanf("%s", str1);
	return 0;
}
*/
//5問題:遞迴數列的計算
//以下函式的功能是用遞迴的方法計算x的n階勒讓德多項式的值。已有呼叫語句p(n,x);編寫函式實現功能。
/*
#include "stdafx.h"
#include <stdio.h>
float p(int x, int n)
{
	float t, t1, t2;
	if (n == 0) return 1;
	else if (n == 1) return x;
	else
	{
		t1 = (2 * n - 1)*x*p(x, (n - 1));
		t2 = (n - 1)*p(x, (n - 2));
		t = (t1 - t2) / n;
		return t;
	}
}
int main()
{
	int x, n;
	printf("input two int(x and n) : ");
	scanf("%d%d", &x, &n);
	printf("%.2f\n", p(x, n));
	printf("input two int(x and n) : ");
	scanf("%d%d", &x, &n);
	printf("%.2f\n", p(x, n));
	printf("input two int(x and n) : ");
	scanf("%d%d", &x, &n);
	printf("%.2f\n", p(x, n));
	return 0;
}
*/

//6問題:echo功能
//給主函式傳遞引數實現echo功能:
/*
#include "stdafx.h"
#include "stdio.h"
int main(int argc, char *argv[])
{
	int i = 1;
	while (i < argc)
	{
		printf("%s",argv[i]);
		i++;
	}
	printf("\n");
	scanf("%d",&i);
	return 0;
}
*/
//7-兩陣列比較(對應比較)
//要求從陣列最後一個元素開始逐個元素向前比較,如果2個陣列長度不等,則只比較較短長度陣列個數元素。
/*
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include "stdafx.h"
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);
	printf("the result is %d", result);
	//scanf("%d",&result);
	return 0;
}
*/
//8約瑟夫環--指標和連結串列(可用指標和陣列來做)
//約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。
//從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;
/*
//依此規律重複下去,直到圓桌周圍的人全部出列。
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
	int num;
	struct Node *next;//一個Node型別的指標
}LinkList;
LinkList *creat(int n)//返回一個LinkList型別的指標
{
	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)); //Malloc()向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。C,C++規定,void* 型別可以強制轉換為任何其它型別的指標。
		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<m; i++)//*從1開始
		{
			q = p;
			p = p->next;
		}
		printf("%5d",p->num);
		s = p;
		q->next = p->next;
		p = p->next; //使p指向新的起點
		free(s);//free()與malloc()函式配對使用,釋放malloc函式申請的動態記憶體
	}
	printf("%5d\n", p->num);
}
int main()
{
	LinkList *L;
	int n, m;
	n = 9;//n=9個人
	m = 5;//出列的號數為5
	L = creat(n);
	fun(L, m);
	scanf("%d",&n);
	return 0;
}
*/
//9-號碼有效性判斷
//特點如下:1、  長度13位;2、  以86的國家碼打頭;3、  手機號碼的每一位都是數字。
/*
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#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 = 3;
	int result;
	switch (ichar)
	{
		case 0:
			pchar = "8612345363789"; break;		//返回:  1
		case 1:
			pchar = "861111111111111"; break;	//
		case 2:
			pchar = "86s1234536366"; break;		//
		case 3:
			pchar = "1392222222222"; break;
		default:
			break;
	}
	result = verifyMsisdn(pchar);
	printf("result is %d\n", result);
	//scanf("%d",result);
	return 0;
}
*/
//10-迴文陣列判斷
/*
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include "string.h"
int huiwen(char p[])
{
	int len = strlen(p);//sizeof(p);
	int i=len/2;
	for (int j = 0; j < i; j++)
	{
		if (p[i] != p[len-i-1])
		{
			return 0;//NO
		}
	}
	return 1;		//YES
}
int main()
{
	char str1[12];
	printf("輸入陣列:\n");
	scanf("%s",str1);
	printf("輸入陣列:%d \n",huiwen(str1));
	//==========================
	//char str1[12];
	printf("輸入陣列:\n");
	scanf("%s", str1);
	printf("輸入陣列:%d \n", huiwen(str1));
	//==============================
	//char str1[12];
	printf("輸入陣列:\n");
	scanf("%s", str1);
	printf("輸入陣列:%d \n", huiwen(str1));
}
*/
//10-選秀打分
//總分 = 專家評委平均分  * 0.6 + 大眾評委 * 0.4,總分取整。如果沒有大眾評委,則 總分 = 專家評委平均分,總分取整。函式最終返回選手得分
/*
#include "stdafx.h"
#include "iostream" 
using namespace std;
float cal_score(int score[], int judge_type[], int n)
{
	if (NULL == score || NULL == judge_type || 0 == n)  return 0;
	float sum = 0;
	int sum1 = 0, count1 = 0;
	int sum2 = 0, count2 = 0;
	for (int i = 0; i<n; i++)
	{
		if (judge_type[i] == 1)
		{
			sum1 = sum1 + score[i];
			count1++;
		}
		else
		{
			sum2 = sum2 + score[i];
			count2++;
		}
	}
	if (0 == count2)  sum = sum1 / count1;
	else  sum = (sum1 / count1)*0.6 + (sum2 / count2)*0.4;
	return sum;
}

void main()
{
	int score[3] = { 12,13,15 };
	int judge_type[3] = { 1,1,2 };
	printf("%d\n", cal_score(score, judge_type, 3));
}
*/
//11-問題:給定一個陣列 input[] ,如果陣列長度 n 為奇數,則將陣列中最大的元素放到 output[] 陣列最中間的位置,
//如果陣列長度 n 為偶數,則將陣列中最大的元素放到 output[] 陣列中間兩個位置偏右的那個位置上,
//然後再按從大到小的順序,依次在第一個位置的兩邊,按照一左一右的順序,依次存放剩下的數。
/*
#include "stdafx.h"
#include "iostream" 
using namespace std;
void bubblesort(int data[], int n)
{
	int temp = 0;
	for (int i = 0; i<n; i++)
	{
		for (int j = i + 1; j<n; j++)
		{
			if (data[i]<data[j])
			{
				temp = data[i];
				data[i] = data[j];
				data[j] = temp;
			}
		}
	}
}

void sort(int input[], int n, int output[])
{
	int *sort_input = new int[n];//用new和delete動態建立和釋放陣列或單個物件
	for (int i = 0; i<n; i++)
	{
		sort_input[i] = input[i];
	}
	bubblesort(sort_input, n);				//先做氣泡排序
	if (1 == n % 2)//奇
	{
		int mid = n / 2;
		int k = 0;
		output[mid] = sort_input[k++];
		for (int j = 1; j <= n / 2; j++)
		{
			output[mid - j] = sort_input[k++];
			output[mid + j] = sort_input[k++];
		}
	}
	else         //偶數
	{
		int mid = n / 2;
		int k = 0;
		output[mid] = sort_input[k++];
		for (int j = 1; j<n / 2; j++)
		{
			output[mid - j] = sort_input[k++];
			output[mid + j] = sort_input[k++];
		}
		output[0] = sort_input[k++];

	}

	delete sort_input;//用new和delete動態建立和釋放陣列或單個物件
}
void main()
{
	int input1[] = { 3, 6, 1, 9, 7 };
	int output1[5];
	memset(output1, 0, 5 * sizeof(int));
	int input2[] = { 3, 6, 1, 9, 7, 8 };
	int output2[6];
	memset(output2, 0, 6 * sizeof(int));

	sort(input1, 5, output1);
	sort(input2, 6, output2);
	for (int k = 0; k<5; k++)
		printf("%d", output1[k]);
	printf("\n");
	for (int k = 0; k<6; k++)
		printf("%d", output2[k]);
	printf("\n");
}
*/
//12刪除字串中所有給定的子串問題描述:
//在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。
/*
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
void del_substr(char s1[],char s2[]);
 
void del_substr(char s1[],char s2[])
{
    int i=0,k=0,j=0,len_s1,len_s2;
 
    len_s1=strlen(s1);
    len_s2=strlen(s2);
    //子串比主串長,沒有意義
    if(len_s1<len_s2)
        return;
 
    while(s1[i])//遍歷s1
    {
        if(s1[i]-s2[0])//如果和子串的第一個字元不相等,則s1[i]存到"另一個串"
            s1[k++]=s1[i++];
        else//如果和子串以一個字元相等,則有可能存在子串
        {
            j=1;
            while(!(s1[i+j]-s2[j]) && j<len_s2)
                ++j;
            if(!(j-len_s2))//如果是子串,則將i直接跳過子串,然後繼續執行,將不是子串的存在"另一個串"
                i+=j;//跳過子串
            else
                s1[k++]=s1[i++];
        }
    }
    s1[k]=0;//刪除後,末尾補0
 
    return;
}
int main(void)
{
	char date[1001], substring[1001], len1, len2;
	printf("輸入字串:");
	gets_s(date,100);
	len1 = strlen(date);//

	printf("輸入子串:");
	gets_s(substring,100);

	del_substr(date, substring);//刪除子串
	len2 = strlen(date);

	if (len1 > len2)
	{
		printf("刪除後:");
		puts(date);
	}
	else
		printf("Error!");//沒有子串,輸出error

	return 0;
}
*/
//13-作業系統任務排程問題。作業系統任務分為系統任務和使用者任務兩種。其中,系統任務的優先順序 < 50,使用者任務的優先順序 >= 50且 <= 255。
//優先順序大於 255的為非法任務,應予以剔除。現有一任務佇列 task[],長度為 n,task中的元素值表示任務的優先順序,數值越小,優先順序越高。
//函式 scheduler 實現如下功能,將 task[] 中的任務按照系統任務使用者任務依次存放到 system_task[] 陣列和 user_task[] 陣列中 
//(陣列中元素的值是任務在 task[] 陣列中的下標),並且優先順序高的任務排在前面,優先順序相同的任務按照入隊順序排列(即先入隊的任務排在前面),陣列元素為-1表示結束。
/*
#include "iostream" 
#include "stdafx.h"
using namespace std;
void change(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void bubblesort(int data[], int n, int index[])//氣泡排序並記錄排序後下標 
{
	int temp = 0;
	for (int j = 0; j<n; j++)
		index[j] = j;
	for (int i = 0; i<n; i++)
	{
		for (int j = i + 1; j<n; j++)
		{
			if (data[i]>data[j])
			{
				change(&data[i], &data[j]);
				change(&index[i], &index[j]);
			}
		}
	}
}
void scheduler(int task[], int n, int system_task[], int user_task[])
{
	int *sort_task = new int[n];
	int *index = new int[n];
	for (int i = 0; i<n; i++)
	{
		sort_task[i] = task[i];
	}
	bubblesort(sort_task, n, index);
	int i = 0;
	while (sort_task[i]<50)
	{
		system_task[i] = index[i];
		i++;
	}
	system_task[i] = -1;
	for (int m = 0; m <= i; m++)
	{
		printf("%d ", system_task[m]);
	}
	printf("\n");
	int k = 0;
	while (sort_task[i]>50 && sort_task[i] <= 255)
	{
		user_task[k++] = index[i++];
	}
	user_task[k] = -1;
	for (int l = 0; l <= k; l++)
	{
		printf("%d ", user_task[l]);
	}
	printf("\n");
	delete sort_task;
	delete index;
}
void main()
{
	int task[] = { 0, 30, 155, 1, 80, 300, 170,40,99 };
	int n = sizeof(task) / sizeof(int);
	int *system_task = new int[n];
	int *user_task = new int[n];
	scheduler(task, n, system_task, user_task);
}
*/
//14-簡單四則運算問題描述:輸入一個只包含個位數字的簡單四則運算表示式字串,計算該表示式的值 
//注:
//1、表示式只含 + , -, *, / 四則運算子,不含括號
//2、表示式數值只包含個位整數(0 - 9),且不會出現 0作為除數的情況
//3、要考慮加減乘除按通常四則運算規定的計算優先順序
//4、除法用整數除法,即僅保留除法運算結果的整數部分。比如 8 / 3 = 2。輸入表示式保證無0作為除數情況發生
//5、輸入字串一定是符合題意合法的表示式,其中只包括數字字元和四則運算子字元,除此之外不含其它任何字元,不會出現計算溢位情況。
/*
#include "stdafx.h"
#include <stdio.h> 
#include <string.h> 
#include "assert.h"
struct stack
{//存放後續排列的表示式,模擬棧
	char str[80];
	int top;
};

struct sstack
{//存放計算表示式的值,模擬棧???
	int str[80];
	int top;
};
int calculate(int len, char *expStr)
{
	char *postexp = new char[len + 1];
	stack opstack;
	sstack calstack;
	calstack.top = -1;
	opstack.top = -1;
	int i = 0;
	int k = 0;
	while (expStr[i] != '\0')
	{
		if (expStr[i] >= '0'&&expStr[i] <= '9')
		{
			postexp[k++] = expStr[i];
		}
		else if (expStr[i] == '+' || expStr[i] == '-')
		{
			while (opstack.top >= 0)
			{
				postexp[k++] = opstack.str[opstack.top--];
			}
			opstack.top++;
			opstack.str[opstack.top] = expStr[i];
		}
		else if (expStr[i] == '*' || expStr[i] == '/')
		{
			while (opstack.top >= 0 && (opstack.str[opstack.top] == '*'
				|| opstack.str[opstack.top] == '/'))
			{
				postexp[k++] = opstack.str[opstack.top--];
			}
			opstack.top++;
			opstack.str[opstack.top] = expStr[i];
		}
		i++;
	}
	while (opstack.top >= 0)
	{
		postexp[k++] = opstack.str[opstack.top--];
	}
	int temp1 = 0;
	int temp2 = 0;
	for (i = 0; i<len; i++)
	{
		if (postexp[i] >= '0'&&postexp[i] <= '9')
		{
			calstack.top++;
			calstack.str[calstack.top] = postexp[i] - '0';
		}
		else if (postexp[i] == '+')
		{
			temp1 = calstack.str[calstack.top--];
			temp2 = calstack.str[calstack.top];
			calstack.str[calstack.top] = temp2 + temp1;
		}
		else if (postexp[i] == '-')
		{
			temp1 = calstack.str[calstack.top--];
			temp2 = calstack.str[calstack.top];
			calstack.str[calstack.top] = temp2 - temp1;
		}
		else if (postexp[i] == '*')
		{
			temp1 = calstack.str[calstack.top--];
			temp2 = calstack.str[calstack.top];
			calstack.str[calstack.top] = temp2 * temp1;
		}
		else if (postexp[i] == '/')
		{
			temp1 = calstack.str[calstack.top--];
			temp2 = calstack.str[calstack.top];
			calstack.str[calstack.top] = temp2 / temp1;
		}
	}
	printf("%d\n", calstack.str[calstack.top]);
	return calstack.str[calstack.top];
}
int main()
{
	char *expStr = "6+8*4-9/2";
	int len = strlen(expStr);
	calculate(len, expStr);
	return 0;
}
*/
//15-德州撲克問題:一副牌中發五張撲克牌給你:讓你判斷數字的組成: 
//有以下幾種情況:
//1:四條:即四張一樣數值的牌(牌均不論花色)2:三條帶 一對
//3:三條帶兩張不相同數值的牌
//4:兩對
//5:順子  包括 10,J,Q,K,A
//6:什麼都不是
//7:只有一對
/*
#include "stdafx.h"
#include "stdio.h"
void sort(int data[], int n)
{
	int temp = 0;
	for (int i = 0; i<n; i++)
	{
		for (int j = i + 1; j<n; j++)
		{
			if (data[i]<data[j])
			{
				temp = data[i];
				data[i] = data[j];
				data[j] = temp;
			}
		}
	}
}
void test(int a[], int len)
{
	int *b = new int[len];
	int count = 0;
	bool temp = false;
	for (int i = 0; i<len; i++)
	{
		b[i] = a[i];
	}
	sort(b, 5);
	for (int i = 0; i<len - 1; i++)
	{
		if (b[i] == b[i + 1])
			count++;
	}
	switch (count)
	{
	case 0:
		if (b[0] - b[4] == 4 && b[0] - b[3] == 3 && b[0] - b[2] == 2 && b[0] - b[1] == 1)
		{
			printf("順子");
		}
		else
			printf("什麼都不是");
		break;
	case 1:
		printf("只有一對");
		break;
	case 2:
		for (int i = 0; i<3; i++)
		{
			if (b[i] == b[i + 2])
			{
				printf("三條帶兩張不相同數值的牌");
				temp = true;
				break;
			}
		}
		if (!temp)
		{
			printf("兩對");
		}
		break;
	case 3:
		if (b[1] == b[3])
			printf("四條:即四張一樣數值的牌");
		else
			printf("三條帶一對");
		break;
	}
}
int main()
{
	int a[5] = { 3,3,3,3,12 };
	printf("\n\t");
	test(a, 5);
	printf("\n\t");
	int b[5] = { 1,3,3,3,12 };
	test(b, 5);
	return 0;
}
*/
//16-刪除陣列中的重複元素
#include "stdafx.h"
#include <iostream>
using namespace std;
int de(int a[], int n)
{
	for (int i = 0; i<n; i++)
		for (int j = i + 1; j<n; j++)
			if (a[j] == a[i])
			{
				for (int k = j; k<n - 1; k++)
					a[k] = a[k + 1];
				n--;
			}
	for (int i = 0; i<n; i++)
		cout << a[i] << " ";
	cout << endl;
	return 0;
}

int main()
{
	int a[10];
	int m = 10;
	for (int l = 0; l<10; l++)
		cin >> a[l];
	de(a, m);
	return 0;
}


 

相關文章