通过比较关键词找到所有科目通过的批量学生

时间:2017-11-03 07:12:53

标签: algorithm c#-4.0

问题是这样的。有5名学生按批次分组。一批中的每个学生都应该通过5个科目中的至少一个。 5个科目是物理(p),化学(c),botony(b),数学(m)和动物学(z)。我们需要找到那批通过这些学生的学生。

所以可能有像

这样的批次
batch-1
pcmbz 

batch2
pccmb (not one student passed in zoology)

batch3
zmbcc (not one student passed in physics)

etc...

所以如果用户提供像pcmbzpczbmpccmb这样的输入。共有3批次,其中2批已经清除了5名受试者中的至少一名受试者。

我的代码:

static int team(string skills)
     {
         char[] subjects = { 'p', 'c', 'm', 'b', 'z' };
         int count = 0;
         int p = 0, c = 0, m = 0, b = 0, z = 0;
         int divisor = 0;
         char[] result = skills.ToCharArray();
         StringBuilder sb = new StringBuilder();

         //parse the string to 5 chars each representing the 5 students subject.

         for (int l = 0; l < skills.Length; l++)
         {
             if (l % 5 == 0 && l > 0)
             {
                 sb.Append(" ");
             }
             sb.Append(skills[l]);
         }


         string format = sb.ToString();
         char space = ' ';
         string[] resultarray = format.Split(space);


         for (int i = 0; i < resultarray.Length; i++)
         {
             if (resultarray[i].Contains("pcmbz"))
             {
                 count = count + 1;
             }
         }

         return count;
     }

然而,当我使用contains时,它匹配确切的单词并且不识别混乱的单词。此处pcmbzpczbm相同。

我是否应该再次使用代码中的字谜逻辑然后检查它是否相同然后将其添加到计数中还是有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

首先,我必须说我到目前为止不是经验丰富的C#程序员。话虽如此,我甚至确定我的解决方案不是性能最佳的解决方案,但如果我能正确理解您的问题,它就能完成工作。

检查你所建议的字谜也是可能的,但如果你以后要改变你的主题,你必须改变每一个字谜字符串。我们想要做的是检查给定字符串中是否存在每个主题字符。

以下是我在代码中执行最后一次for循环的方式(其他一切都是你完成的方式):

    for (int i = 0; i < resultarray.Length; i++)
    {
        bool containsAllSubjects = true;
        foreach(char sub in subjects)
        {
            if (!resultarray[i].Contains(sub)) containsAllSubjects = false;
        }
        if (containsAllSubjects) count++;
    }

现在让我解释一下这段代码是通过和平来做和平的:

    foreach(char sub in subjects)

使用此 foreach-Loop ,我们会将您放入 subject 数组中的每个角色都获得。这只是为了确保代码在您更改主题字符时工作的便利性。

    if(!resultarray[i].Contains(sub)) containsAllSubjects = false; 

因为我们正在使用此表达式中的subject数组中的每个 sub 字符进行迭代,所以我们检查 resultarray 中的当前字符串是否包含主题中的每一个字符。如果当前字符串中缺少一个或多个主题字符,我们将布尔变量设置为false。

    if(containsAllSubjects) count++;

由于布尔变量 containsAllSubjects 仅在每个主题都在我们检查的字符串中时才为真,我们可以将计数增加一个。

我建议的另一件事是更改技能字符串的分隔。你现在这样做的方法是在你的主题数组包含5个元素后,将5个字符分开,这是正确的方法。但是,如果您想要更改主题数量,则必须考虑在技能字符串分离中更改硬编码的幻数5。这就是为什么我建议根据subject数组包含的元素数量进行分离:

    if (l % subjects.Length == 0 && l > 0)
    {
         sb.Append(" ");
    }

这样,您的代码就主题数量而言变得灵活。

Try it online!

我希望我的回答可以帮助你,至少在某种程度上帮助你。