我正在尝试解决“代码出现”的难题,这需要找出密码列表及其策略中有多少密码是有效的。
但我的代码总是返回 627 而不是 474,这是我输入拼图的官方解决方案。
有人能解释一下哪里出了问题吗?
我的拼图输入: GoogleDrive_PuzzleInput
public static void Day2()
{
int i = 0;
int result = 0;
string[] text = ReadAllLines(@"C:\Users\Kcir\Documents\Programming\myapp\day2.txt");
string[] policy = new string[text.Length];
string[] corrupted = new string[text.Length];
int[] min = new int[text.Length];
int[] max = new int[text.Length];
foreach (string x in text)
{
policy[i] = x.Substring(x.IndexOf(":") - 1, 1);
min[i] = Int32.Parse(x.Substring(0, x.IndexOf("-")));
max[i] = Int32.Parse(x.Substring(x.IndexOf("-") + 1, 2));
corrupted[i] = x.Substring(x.IndexOf(":") + 2);
i++;
}
for (i = 0; i < corrupted.Length; i++)
{
int count = 0;
for (int j = 0; j < max[i]; j++)
{
if (corrupted[i].Contains(policy[i]))
{
corrupted[i] = corrupted[i].Substring(corrupted[i].IndexOf(policy[i]) + 1);
count++;
}
}
if (count >= min[i] && count <= max[i])
{
result++;
}
}
WriteLine("Number of valid passwords: " + result);
}
答案 0 :(得分:1)
你的嵌套循环条件不好 - 你的算法永远不会超过策略的最大值
答案 1 :(得分:1)
您的代码不会检查损坏数组中的所有字母。第一次出现错误计数的是第 6 种情况,即 5-14 t: ttttnttttttdttttttt
。有 17 个字母需要检查,但您只检查前 14 个。我建议你学习如何调试。看我的截图,损坏的 [i] 仍然有 3 个字母,但你的代码退出了循环。
我已经简化了您的代码(不需要大量数组)并修复了错误(检查所有字母):
void Main()
{
var valid = 0;
var data = File.ReadAllLines(@"D:\day2.txt");
foreach (var line in data)
{
var letter = line[line.IndexOf(":") - 1]; // letter in policy
var min = Int32.Parse(line.Substring(0, line.IndexOf("-"))); // minimum count in policy
var max = Int32.Parse(line.Substring(line.IndexOf("-") + 1, 2)); // maximum count in policy
var password = line.Substring(line.IndexOf(":") + 2); // password need to be verified
var count = 0; // count of letter in password
foreach (var l in password) // loop all letters in password
{
if (l == letter) count++; // increment number of letters found in password
}
if (count >= min && count <= max) valid++; // increment number of valid passwords
}
Console.WriteLine(valid);
}
LinqPad 中的结果: