首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助返回基于检查字符串的字母的点

需要帮助返回基于检查字符串的字母的点
EN

Stack Overflow用户
提问于 2019-06-07 01:22:48
回答 3查看 37关注 0票数 0

我试图检查字符串是否有一个基于给定测试用例的字母。但是,字母a有例外情况,每一个字母都将被计算为值的一半。例如,字母a值300,但我们想除以2,而每个字母将值150分。

UnitTest:

代码语言:javascript
复制
[TestCase("software", 'w', 250, 250)]
[TestCase("craftmanship", 'a', 300, 300)]
public void WheelofFortune(string secretWord, char letterGuess, int pointValue, int expected)
    {
        var actual = warmups.WheelofFortune(secretWord, letterGuess, pointValue);
        Assert.AreEqual(expected, actual);
    }

单元:

代码语言:javascript
复制
//Given a target word, a letter guess by a customer, and a point value. 
//Return the number of points earned.

    public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
    {
        int sum = 0;
        int pointValue2 = (pointValue / 2);

        for (int i = 0; i < secretWord.Length; i++)
        {
            if (secretWord[i] == letterGuess)
                sum += pointValue;

            if (secretWord[i] == letterGuess && letterGuess == 'a')
                sum += pointValue2;

            if (secretWord[i] == secretWord.Length - 1)
                return sum;
        }
        return sum;            
    }

问题在于工艺:信息:预期: 300,但曾经: 900。

为什么我得到的是900而不是300?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-07 01:33:35

这是因为您的逻辑在简单调试时是不正确的,它建议,当您找到字母a时,这两个逻辑都会执行,因此,而不是每次迭代150,您的值将变为450,因此450*2 = 900

代码语言:javascript
复制
if (secretWord[i] == letterGuess)
                sum += pointValue;

 if (secretWord[i] == letterGuess && letterGuess == 'a')
                sum += pointValue2;

使用开关的修复1:

代码语言:javascript
复制
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
    int sum = 0;

    for (int i = 0; i < secretWord.Length; i++)
    {
        switch(secretWord[i])
        {
            case 'a':
                sum += pointValue/2;
            break;
            default:
                if (secretWord[i] == letterGuess)
                  sum += pointValue;
            break;          
        }
    }
    return sum;
}

Fix 2:一个更好的设计,使用字典(只需在字典中添加另一个键,它将根据新的逻辑自动计算)

代码语言:javascript
复制
public static Dictionary<char,double> sampleData = new Dictionary<char, double>
{
    ['a'] = 0.5
};

public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
    int sum = 0;

    for (int i = 0; i < secretWord.Length; i++)
        if(sampleData.ContainsKey(secretWord[i]))
            sum += (int)(pointValue * sampleData[letterGuess]);

    return sum;
}
票数 1
EN

Stack Overflow用户

发布于 2019-06-07 02:04:32

本和先生已经给你展示了代码中的直接问题。我将更多地关注代码的结构。

从你的问题听起来你想要这样的东西:

给定一个单词、一个猜测字符和一个分数,将分数乘以匹配字符的数目。如果猜到的字符是'a',那么它的分数是一半。

在这种情况下,代码可以大大简化为:

代码语言:javascript
复制
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
    int count = secretWord.Count(letter => letter == letterGuess);
    int sum = pointValue * count;
    if (letterGuess == 'a')
        sum /= 2;
    return sum;
}

这会给出您正在测试的值,抽象出循环,并读取更多类似于描述的内容。它还简化了逻辑,使您不太可能错过类似的双重匹配。

不确定为什么您的代码包含一个测试,测试的字符是否等于字符串长度小于1,因为这似乎与问题无关。如果需要的话很乐意纠正。

票数 3
EN

Stack Overflow用户

发布于 2019-06-07 01:33:46

您要同时执行两个if子句,所以:

代码语言:javascript
复制
if (secretWord[i] == letterGuess)
            sum += pointValue;

您需要匹配两次a,以便将2x300 = 600相加到总和中。然后

代码语言:javascript
复制
if (secretWord[i] == letterGuess && letterGuess == 'a')
            sum += pointValue2;

这也是匹配的,所以将2*150 = 300相加到总和中。600 + 300 = 900

您需要使用if else或case语句。所以,就像:

代码语言:javascript
复制
    for (int i = 0; i < secretWord.Length; i++)
    {
        if (secretWord[i] == letterGuess && letterGuess == 'a')
        {
            sum += pointValue2;
        }
        else if (secretWord[i] == letterGuess)
        {
            sum += pointValue;
        }
        //if (secretWord[i] == secretWord.Length - 1)
        //{
        //    return sum;
        //}

    }

这样,一旦满足了一个if子句,它就会忽略其余的子句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56486892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档