我怎样才能解决我的问题
How can I fix my condition
我想检查一个数组,如果它的三个值之和为 0。一个条件是不允许三元组 (0,0,0)
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
for (int i = 0; i < num.Length; i++)
{
for (int j = 0; j < num.Length; j++)
{
for (int k = 0; k < num.Length; k++)
{
if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
{
List<int> listInt = new List<int>();
listInt.Add(num[i]);
listInt.Add(num[j]);
listInt.Add(num[k]);
if (!returnList.Contains(listInt))
{
returnList.Add(listInt);
}
}
}
}
}
return returnList;
}
这是我正在努力解决的问题 if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
所以我尝试了第二个括号:(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
以确保所有这些条件都需要同时为真。如您所知,这对我不起作用。结果中不允许每个零,但它只能防止三重零。
一个解决方案是:(-1, 0, 1) 但我不会得到它,因为我的条件不接受其中的零。
Link 问题(如果有兴趣):https://leetcode.com/problems/3sum/
您不应该尝试检查是否所有这些都不等于零,而是检查是否至少有一个不等于零。
所以
(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
做这个检查:
&& (num[i] !=0 || num[j]!= 0 || num[k]!= 0)
改变
&& (num[i] !=0 && num[j]!= 0 && num[k]!= 0)
至:
&& !(num[i] == 0 && num[j] == 0 && num[k] == 0)
你之前的条件是假的;这意味着 i、j 和 k 必须全部 不同于 0。!(i == 0 || j == 0 || k == 0)
是你想要做的。
我会选择这个:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (int i in num)
{
foreach (int j in num)
{
foreach (int k in num)
{
if (i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0))
{
returnList.Add(new List<int> { i, j, k });
}
}
}
}
return returnList;
}
如果你有点受虐狂,用这个:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (List<int> listInt in num.SelectMany(i => num.SelectMany(j => num.Where(k => i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0)).Select(k => new List<int> {i, j, k}).Where(listInt => !returnList.Contains(listInt)))))
{
returnList.Add(listInt);
}
return returnList;
}
顺便说一下,检查 returnList 是否包含一个新列表是无用的,因为它总是错误的。 (请参阅第一个代码的编辑,第二个无法更新。)
我想检查一个数组,如果它的三个值之和为 0。一个条件是不允许三元组 (0,0,0)
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
for (int i = 0; i < num.Length; i++)
{
for (int j = 0; j < num.Length; j++)
{
for (int k = 0; k < num.Length; k++)
{
if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
{
List<int> listInt = new List<int>();
listInt.Add(num[i]);
listInt.Add(num[j]);
listInt.Add(num[k]);
if (!returnList.Contains(listInt))
{
returnList.Add(listInt);
}
}
}
}
}
return returnList;
}
这是我正在努力解决的问题 if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
所以我尝试了第二个括号:(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
以确保所有这些条件都需要同时为真。如您所知,这对我不起作用。结果中不允许每个零,但它只能防止三重零。
一个解决方案是:(-1, 0, 1) 但我不会得到它,因为我的条件不接受其中的零。
Link 问题(如果有兴趣):https://leetcode.com/problems/3sum/
您不应该尝试检查是否所有这些都不等于零,而是检查是否至少有一个不等于零。
所以
(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
做这个检查:
&& (num[i] !=0 || num[j]!= 0 || num[k]!= 0)
改变
&& (num[i] !=0 && num[j]!= 0 && num[k]!= 0)
至:
&& !(num[i] == 0 && num[j] == 0 && num[k] == 0)
你之前的条件是假的;这意味着 i、j 和 k 必须全部 不同于 0。!(i == 0 || j == 0 || k == 0)
是你想要做的。
我会选择这个:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (int i in num)
{
foreach (int j in num)
{
foreach (int k in num)
{
if (i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0))
{
returnList.Add(new List<int> { i, j, k });
}
}
}
}
return returnList;
}
如果你有点受虐狂,用这个:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (List<int> listInt in num.SelectMany(i => num.SelectMany(j => num.Where(k => i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0)).Select(k => new List<int> {i, j, k}).Where(listInt => !returnList.Contains(listInt)))))
{
returnList.Add(listInt);
}
return returnList;
}
顺便说一下,检查 returnList 是否包含一个新列表是无用的,因为它总是错误的。 (请参阅第一个代码的编辑,第二个无法更新。)