char 数组存储空值

char array stores null values

我目前正在做一些代码挑战,我 运行 遇到了一个我找不到解决方案的问题。

public static bool SelfDescribing(string num)
{

    char[] digit = num.ToArray();
    int bound = digit.Count();

    for (int i = 0; digit.Length != 0 && i < bound; i++)

    {

        int arrLength = 0;
        var count = num.Count(x => x == digit[i]);
        if (count == i)
        {
            arrLength++;
            if (arrLength == bound)
            {
                return true;
            }
        }          
    }
    return false;
}

每次我尝试将字符串传递给它时,它都会将单独的值存储为我的数字数组中的空值。例如,我试图传递值 test1 = "1211"

你的方法是错误的有多种原因:

1- 您正在比较计数和索引,您应该将计数与该索引中的值进行比较。

if (count == i) 应该是 if (count == char.GetNumericValue(digit[i]))

2- 您应该计算索引而不是存储在该索引处的字符:

3- 最重要的是:当您 发现不匹配 时,您应该 return false。您不需要比较计数成功匹配数字。

num.Count(x => x == digit[i]); 应该是 num.Count(x => x == char.Parse(i.ToString()));

您可以这样修正您的方法:

(这不是首选逻辑,检查下面的备选方案)

public static bool SelfDescribing(string num)
{

    char[] digit = num.ToArray();
    int bound = digit.Count();

    int sucessCount = 0;
    for (int i = 0; digit.Length != 0 && i < bound; i++)
    {
        var count = num.Count(x => x == char.Parse(i.ToString()));
        if (count == char.GetNumericValue(digit[i]))
        {
            sucessCount++;
        }
    }
    return sucessCount == digit.Length;
}

要优化您的方法:

public static bool SelfDescribing(string num)
{
    for (int i = 0; i < num.Length; i++)
    {
        var count = num.Count(x => x == char.Parse(i.ToString()));
        if (count != char.GetNumericValue(num[i]))
            return false;
    }
    return true;
}

替代工作逻辑:

public static bool SelfDescribing(string num)
{
    bool result = true;

    int[] numbersArray = num.ToArray().Select(x => (int)char.GetNumericValue(x)).ToArray();

    var occurences = numbersArray.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());

    for (int i = 0; i < numbersArray.Length; i++)
    {
        int occ;

        if (occurences.TryGetValue(i, out occ))
        {
            if(occ != numbersArray[i])
            {
                result = false;
                break;
            }
        }
        else
        {
            if (i == 0)
                continue;
        }
    }

    return result;
}

这会给你预期的结果吗?你还没有解释你想要做什么,但似乎 arrLength 应该只初始化一次,可能。

public static bool SelfDescribing(string num)
{
   char[] digit = num.ToArray();
   int bound = digit.Count();
   int arrLength = 0;

   for (int i = 0; digit.Length != 0 && i < bound; i++)
   {
        var count = num.Count(x => x == digit[i]);
        if (count == i)
        {
            arrLength++;
            if (arrLength == bound)
            {
                return true;
            }
         }          
   }
   return false;
 }