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;
}
我目前正在做一些代码挑战,我 运行 遇到了一个我找不到解决方案的问题。
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;
}