我怎样才能解决我的问题

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 是否包含一个新列表是无用的,因为它总是错误的。 (请参阅第一个代码的编辑,第二个无法更新。)