一个舞蹈学院提供早晚课程。每个加入该学院的人都会获得一个唯一的ID。人们可以选择任意数量的舞蹈形式。有些在任何舞蹈形式上都不是很完美的人早晚课程都参加。舞蹈教练为参加课程的所有人员准备了一份早晚课程的单独列表。人员的ID在列表中重复的次数与他/她选择的舞蹈形式的数量相同。
该学院计划在年度活动中展示各种舞蹈形式。该学院想找一些能够在最后一天引领该活动的引领者。因此,教练正在寻找各种舞蹈形式中完美的舞者。根据教练的说法,完美的舞者是只上早课或者晚课一种课程的人。
写一个算法来找出教练选择来引领活动的完美舞者的人数。如果一个舞者在一种以上的舞蹈形式中是完美的,则他/她将被计算的次数与他/她完美的舞蹈形式的数量相同。
输入
该函数/方法的输入包括四个参数——
countMorning,一个整数,表示上早课的人数。
countEvening,一个整数,表示上晚课的人数。
morningList,一个整数列表,表示上早课人员的ID。
eveningList,一个整数列表,表示上晚课人员的ID。
输出
返回一个整数,表示教练选择来引领活动的完美舞者的人数。
示例
输入:
countMorning = 11
countEvening = 10
morningList = [1,1,2,3,4,5,5,7,6,9,10]
eveningList = [11,12,13,4,5,6,7,18,19,20]
输出:
12
解释:
早晚两个课程都参加的人员为4、5、6和7。
只参加早课或晚课的完美舞者为[1,1,2,3,9,10,11,12,13,18,19,20]。
所以,所有舞蹈形式的完美舞者人数是12。
int perfectDancers(int countMorning, int countEvening, int *morningList, int *eveningList)
{
int Mcount = 0, Ecount = 0;
for (int i = 0; i < countMorning; i++)
{
//如果检测到-1,则退出此次循环
if (morningList[i] == -1)
continue;
for (int j = 0; j < countEvening; j++)
{
//如果检测到-1,则退出此次循环
if (eveningList[j] == -1)
continue;
//检测到相同的,则把后面所有相同的都置为-1
if (morningList[i] == eveningList[j]){
for (int n = i + 1; n < countMorning; n++){
if (morningList[n] == morningList[i])
morningList[n] = -1;
}
for (int m = j + 1; m < countEvening; m++){
if (eveningList[m] == eveningList[j])
eveningList[m] = -1;
}
}
//将两个相同的置为-1
morningList[i] = eveningList[j] = -1;
}
}
//求出两组数中非负的个数
for (int i = 0; i < countMorning; i++)
{
if (morningList[i] >= 0)
Mcount++;
}
for (int i = 0; i < countEvening; i++)
{
if (eveningList[i] >= 0)
Ecount++;
}
return Mcount+Ecount;
}
思路很清楚,把重复的数字删去(在这里置为-1)即可。