char数组存储空值

本文关键字:空值 存储 数组 char | 更新日期: 2023-09-27 17:57:36

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

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;
}

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

char数组存储空值

您的方法错误有多种原因:

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

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

2-你应该计算索引,而不是存储在该索引中的字符:

3-最重要的是:当发现不匹配时,应返回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;
 }