我怎样才能解决问题

时间:2015-03-25 15:43:12

标签: c# conditional-statements

我想检查一个数组,如果它的三个值之和为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)但我不会得到它,因为我的条件不接受零。

链接到问题(如果感兴趣):https://leetcode.com/problems/3sum/

3 个答案:

答案 0 :(得分:1)

你不应该试图检查它们是否都不等于零,而是检查它们中是否至少有一个不等于零。

所以而不是

(num[i] !=0 && num[j]!= 0 && num[k]!= 0)

执行此检查:

&& (num[i] !=0 || num[j]!= 0 || num[k]!= 0)

答案 1 :(得分:0)

更改

&& (num[i] !=0 && num[j]!= 0 && num[k]!= 0)

为:

&& !(num[i] == 0 && num[j] == 0 && num[k] == 0)

答案 2 :(得分: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是否包含新列表是没用的,因为它总是假的。 (请参阅编辑第一个代码,第二个代码无法更新。)