拼多多
用户拼团
题目大意: 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;
}