笔试代码记录

拼多多

用户拼团

题目大意: A-Z一共26个用户参加拼团,如果两个人参与过同一个拼团,则系统会认为他们是朋友关系。现在输入已有的拼团记录,输出这个记录中一共存在几段朋友关系。

示例:
输入:AB AC ABC
输出:3
说明:前两个团中,AB,AC为两段朋友关系,第三个团中,ABC中存在了AB,AC,BC三段朋友关系。去掉重复的关系,则这个拼团记录中一共存在3段朋友关系。

想法:
第一个想法是用链式结构把每个人的朋友串起来,但是发现好像很难实现。后来发现题目已经说明了用户最多只有26个,所以决定用一个26*26的二维bool数组来记录每个人的朋友,最后再统计数组中true的数量,即为每个人拥有朋友的总数,考虑到AB和BA重复,所以最后只要再除以2即可。

代码:

int main()
{
	bool** user = new bool*[26];
	int i, j;
	for (i = 0; i < 26; i++)
		user[i] = new bool[26]{};  //不加{}指定初始值的话bool数组的初始值是205,有点奇怪

	char* t = new char[1000];
	cin.get(t, 1000);  //因为输入中存在空格,直接使用cin<<t的话会在遇到空格时直接截断
	for (int p = 0, i = 0, j = 0; t[i] != '\0'; p = i + 1)
		for (i = p; t[i] != ' '&&t[i] != '\0'; i++)
			for (j = p; t[j] != ' '&&t[j] != '\0'; j++)
				if(t[i]!=t[j]) //没有自己和自己做朋友的
					user[int(t[i]) - int('A')][int(t[j]) - int('A')] = true;  //int()函数强制转换char得到的是ASCII码,所以减掉A的ASCII码即可

	int count = 0;
	for (i = 0; i < 26; i++)
		for (j = 0; j < 26; j++)
			count += user[i][j];
	cout << count / 2 << endl;

	system("pause");
	return 0;
}

最大的三位数

题目大意: 输入一串数字,从中选出连续的3个字符,组成的三位数是最大的。

示例:
输入:12321
输出:321

想法: 逐位组成3位数,从百位数开始和现有的最大三位数中的百位数进行对比,如果小于现有的三位数的百位数则直接对比下一个字符,以此类推到十位数和个位数。

代码:

int main()
{
	char max100 = '0', max10 = '0', max1 = '0';
	char *t = new char[100];
	cin >> t;
	for (int i = 0; t[i + 2] != '\0'; i++)
	{
		if (t[i] >= max100)
		{
			if (t[i] > max100)  //如果百位数已经是比之前的max100大,那后面两位数就不用比了
			{
				max100 = t[i];
				max10 = t[i + 1];
				max1 = t[i + 2];
				continue;
			}
			if (t[i + 1] >= max10)
			{
				if (t[i + 1] > max10)  //原因同上
				{
					max10 = t[i + 1];
					max1 = t[i + 2];
					continue;
				}
				if (t[i + 2] >= max1)
					max1 = t[i + 2];
			}
		}
	}
	cout << max100 << max10 << max1 << endl;

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值