华为历年实习生上机题,C++代码

(测试题).计算a+b的和

每行包含两个整数a和b
对于每行输入对应输出一行a和b的和
输入
1 5
输出
6

#include <stdio.h>
int main(void)
{
    int m,n,c;
    while (scanf("%d%d",&n,&m)!=EOF)
    {   c=m+n;
        printf("%d\n",c);
    }
}

(测试题).长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换,完成以下函数

/**
 * 交换数组里n和0的位置
 * array: 存储[0-n)的数组
 * len: 数组长度
 * n: 数组里要和0交换的数
 */
extern void swap_with_zero(int* array, int len, int n);

class Solution {
public:
    /**
     * 调用方法swap_with_zero来对array进行排序
     */
    void sort(int* array, int len) {
         for(int i = len - 1; i > 0; i--) {
        if(array[i] == i) //判断是否处于正确位置
            continue;
        //对未处于正确位置的数字进行下面两步交换
        swap_with_zero(array, len, array[i]);//交换0与i位置的数字
        swap_with_zero(array, len, i);//交换0与数字i
    }
    }
};

(2017年实习上机题3).英文句子单词翻转
Eg:You are a dog -> dog are a You

#include<iostream>
#include<string.h>
using namespace std;
void reversestr(char *start, char *end);
int main()
{
	char *temp;
	char *start;
	char *end;
	const char *str = "You are a lucky dog !";
	char *s = new char[strlen(str)]();
	strcpy(s, str);
	reversestr(s, s + strlen(str) - 1);
	temp = s;//操作不影响s;最后可以输出s
	start = temp;
	while (*temp != '\0')//注意是指针指向的不等于‘\0’
	{
		if (*temp == ' ')
		{
			end = temp-1;//弄清楚自加自减还是+1-1
			reversestr(start,end);
			start = temp+1;
		}
		temp++;
	}
	end = temp - 1;
	reversestr(start, end);//通过验证最后一个单词还未翻转,想到最后一个单词后面循环已经退出了
	while (*s != '\0')
	{
		cout << *s;
		s++;
	}
	cout << endl;
	system("pause");
	return 0;
}
/*
*      实现字符串的反转操作
*      初始,start指向字符串第一个字符;
*      初始,end指向字符串最后一个字符;
*/
void reversestr(char *start, char *end)
{
	char temp;
	while (start<end)
	{
		temp = *start;
		*start++ = *end;
		*end-- = temp;
	}
}

(2016年实习上机题1).

#include<iostream>
#include<string>
using namespace std;
int main()
{   
	int i = 0,count=1,next=1;
	string zq;
	cout << "请输入字符串:";
	getline(cin, zq);
	for (i; i < zq.size(); i++)
	{
		if ((zq[i] >= 'a'&& zq[i] <= 'z') || (zq[i] >= 'A'&&zq[i] <= 'Z'))//是字母
		{
			next = i+1;
			for (next; next < zq.size(); next++)
			{
				if ((zq[next] >= 'a'&& zq[next] <= 'z') || (zq[next] >= 'A'&&zq[next] <= 'Z'))
				{
					break;
				}
				else
				{
				}
			}
			if (zq[i] != zq[next])//不连续则输出
			{
				cout << zq[i] << count;
				count = 1;
			}
			else
				count++;
		}
	}
	cout << endl;
	system("pause");
	return 0;
}

(2016年实习上机题2).
测试用例(都合法,且只有’(‘,’)’,’A’):(A)
((()(A))())
代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{   
	int i = 0,left = 0,right=0;
	string zq;
	cout << "请输入生日礼物:";
	getline(cin, zq);
	for (i; i < zq.size(); i++)
	{
		if (zq[i] == '(')
			left++;
		else if (zq[i] == ')')
			right++;
		else if (zq[i] == 'A')
		{
			cout << "愚人指数为:" << left - right << endl;
			break;
		}
		else
			cout << "输入有误!" << endl;
	}
	system("pause");
	return 0;
}

(2016年实习上机题3).

#include <stdio.h>
int bossattack(int hp)//该形参hp为人的血量
{
	int ret, rem;//ret为回合数
	ret = hp / 70 * 5;			// BOSS每5回合造成70点伤害
	rem = (hp % 70 + 9) / 10;
	if (rem > 4)//4回合人不死
		ret += 5;
	else
		ret += rem;
	return ret;
}
int record[1001][10001];
int playerattack(int mp, int hp)//该形参hp为怪兽血量
{
	int r1, r2;
	if (hp <= 0)
		return 0;
	if (record[mp][hp] != -1)
		return record[mp][hp];
	if (mp >= 10)//法力在10以上,消耗法力
		return record[mp][hp] = 1 + playerattack(mp - 10, hp - 60);
	else {
		r1 = 1 + playerattack(mp + 4, hp);//恢复蓝
		r2 = 1 + playerattack(mp, hp - 17);//平A
		return record[mp][hp] = (r1 < r2 ? r1 : r2);
	}
}
int main()
{
	int playerhp, playermp, bosshp;

	while (scanf("%d%d%d", &playerhp, &playermp, &bosshp) != EOF) {
		int i, j, bossdead, playerdead;
		for (i = 0; i < 1001; i++)
			for (j = 0; j < 10001; j++)
				record[i][j] = -1;//初始化全为-1
		playerdead = bossattack(playerhp);//玩家死亡回合数
		bossdead = playerattack(playermp, bosshp);//BOSS死亡回合数
		if (playerdead < bossdead)
			printf("-1\n");
		else
			printf("%d\n", bossdead);
	}
	return 0;
}

(2017年实习上机题1引申).大数相加
代码1:

#include<stdio.h>
#include<string.h>
int main()
{
	int num1[1006], num2[1006], len1, len2, lenmax, i, j;
	char str1[1006], str2[1006];
	while (1)
	{
		scanf("%s %s", &str1, &str2);
		memset(num1, 0, sizeof(num1));
		memset(num2, 0, sizeof(num2));//初始化
		len1 = strlen(str1);
		len2 = strlen(str2);
		lenmax = len1 >= len2 ? len1 : len2;
		for (i = len1 - 1, j = 0; i >= 0; i--, j++)
		{
			num1[j] = str1[i] - '0';//将字符串反转并且转换为数字保存在整型数组中
		}
		for (i = len2 - 1, j = 0; i >= 0; i--, j++)
		{
			num2[j] = str2[i] - '0';//将字符串反转并且转换为数字保存在整型数组中
		}
		for (i = 0; i<lenmax; i++)
		{
			num1[i] = num1[i] + num2[i];//相加
			if (num1[i] >= 10)
			{
				num1[i] = num1[i] - 10;//满十进一
				num1[i + 1] += 1;
			}
		}
		if (num1[lenmax])//判断数字中最大的那个数字的最高位是否产生进位
		{
			printf("%d", num1[lenmax]);
		}
		for (i = lenmax - 1; i >= 0; i--)
		{
			printf("%d", num1[i]);
		}
		putchar(10);//打印换行,换行的ASCII编码为10
	}
}

代码2:

#include<stdio.h>
#include<string.h>
int main()
{
	int num1[1006], num2[1006], len1, len2, lenmin, i, j,result[1006],temp,bit=0;
	char str1[1006], str2[1006];
	while (1)
	{
		scanf("%s %s", &str1, &str2);
		memset(result, 0, sizeof(result));
		memset(num1, 0, sizeof(num1));
		memset(num2, 0, sizeof(num2));//初始化
		len1 = strlen(str1);
		len2 = strlen(str2);
		lenmin = len1 <= len2 ? len1 : len2;
		for (i = 0; i < len1; i++)
		{
			num1[i] = str1[i] - '0';
		}
		for (i = 0; i < len2; i++)
		{
			num2[i] = str2[i] - '0';
		}
		for (i = 0; i < lenmin; i++)
		{
			temp = num1[len1-i-1] + num2[len2-i-1];
			if (temp < 10)
			{
				result[i] = temp+bit;
				bit = 0;
			}
			else
			{
				result[i] = temp - 10+bit;
				bit = 1;
			}
		}
		if (lenmin==len2)
		{
			for (i = 0; i < len1 - len2; i++)
			{
				if(i==len1-len2-1)
				printf("%d", num1[i]+bit);
				else
				printf("%d", num1[i]);
			}
			for(j=0;j<lenmin;j++)
			printf("%d", result[lenmin-1-j]);
		}
		else
		{
			for (i = 0; i < len2 - len1; i++)
			{
				if (i == len2 - len1 - 1)
					printf("%d", num2[i] + bit);
				else
					printf("%d", num2[i]);
			}
			for (j = 0; j<lenmin; j++)
				printf("%d", result[lenmin - 1 - j]);
		}
		putchar(10);//打印换行,换行的ASCII编码为10
	}
}

(2019年成渝地区实习上机题1)
我的另一篇解答

(2017年实习上机题1)
字符串大小写转换:写出一个程序,输入一个字符串,然后输出大写转换为小写之后的字符串。不在字母范围内的字符,需丢弃。例如1:输入:ABC,输出:abc;例如2:输入:AbC输出:abc。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string zq;
	cin >> zq;
	char zqchar[1024],result[1024];
    memset(zqchar,0,1024);
	memset(result, 0, 1024);
	for (int i = 0,j=0; i < zq.size(); i++)
	{
		zqchar[i] = zq[i];
		if ((zqchar[i] >= 'a') && (zqchar[i] <= 'z'))
			result[j++] = zqchar[i];
		else if ((zqchar[i] >= 'A') && (zqchar[i] <= 'Z'))
			result[j++]=zqchar[i]-'A'+'a';//+32
		else
			;
	}
	cout << result << endl;
	system("pause");
	return 0;
}

(2017年实习上机题2)
集五福:以0和1组成的长度为5的字符串代表每个人所得到的福卡,每一位代表一种福卡,1表示已经获得该福卡,单类型福卡不超过一张,随机抽取一个小于10人团队,求该团队最多可以集齐多少套五福。
输入描述:输入若干个“11010”,“00110”的由0,1组成的长度等于5的字符串,代表指定团队中每个人福卡获得情况,
注:1人也可以是一个团队;1人可以有0-5张福卡,但福卡不能重复。
输出描述:输出该团队能凑齐多少套五福。

#include <iostream>
#include <string>
#include<vector>
using namespace std;
int main()
{
	string temp;
	vector<string> zq;
	int min=0,fuka[5] = {};
	while (cin >> temp)
		zq.push_back(temp);
	for (int i = 0; i < zq.size(); i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (zq[i][j] == '1')
				fuka[j]++;
		}
	}
	min = fuka[0];
	for (int i = 0; i < 5; i++)
	{
		if (min > fuka[i])
			min = fuka[i];
	}
	cout << "该团队能凑齐" << min << "套五福" << endl;
	system("pause");
	return 0;
}

(2019年实习上机题1)

(2019年实习上机题2)

其他题目,完善后整理至我的资源中见,有意者可以以少许积分下载。
欢迎大家探讨,发现代码中BUG,或有优化的算法欢迎讨论。

全部评论

相关推荐

1 7 评论
分享
牛客网
牛客企业服务