首页 > 解决方案 > C# 与列表相交

问题描述

在处理 leetcode.com 问题时,我尝试了以下方法,其中包含一个重复的正确结果。该代码应该找到等于零且没有任何重复的 3 个数字的所有可能性。

我正在使用以下 if 语句在列表列表中寻找骗子: if(!returnList.Where(x=>x.Intersect(fullResult).Count()==3).Any())

除了一种情况外,这在所有情况下都会过滤掉骗子。有谁知道为什么或更好的方法来消除列表中的欺骗?

它始终不会过滤 -1, -1, 2 这是一个有效的集合,但返回了 2 次。

粘贴到控制台应用程序以重新创建。

class Program
{
    static void Main(string[] args)
    {
        var output = ThreeSum(new int[] { -1, 0, 1, 2, -1, -4 });
        foreach(var outie in output)
        Console.WriteLine(String.Format("{0}, {1}, {2}", outie[0], outie[1], outie[2]));

        Console.Read();

    }
    static public IList<IList<int>> ThreeSum(int[] nums)
    {

        List<int> lookup = new List<int>();
        foreach (int i in nums)
        {
            lookup.Add(i);
        }

        IList<IList<int>> returnList = new List<IList<int>>();
        for (var i = 0; i < nums.Count(); i++)
        {

            var result = TwoSum(i, lookup);
            if (result != null)
            {
                var fullResult = new List<int>() { nums[i], nums[result[0]], nums[result[1]] };

                if(!returnList.Where(x=>x.Intersect(fullResult).Count()==3).Any())
                {
                    returnList.Add(fullResult);
                }
            }
        }
        return returnList;
    }

    static private int[] TwoSum(int thirdnumIndex, List<int> nums)
    {

        var target = nums[thirdnumIndex];

        for (var i = 0; i < nums.Count(); i++)
        {
            var comp = (target + nums[i]) * -1;
            if (nums.Contains(comp))
            {
                var indexOfComp = nums.IndexOf(comp);

                if (indexOfComp == i || indexOfComp == thirdnumIndex)
                {
                    return null;
                }

                return new int[] { i, indexOfComp };
            }

        }
        return null;
    }
}

标签: c#

解决方案


使用Sort并且SequenceEqual应该工作

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var output = ThreeSum(new int[] { -1, 0, 1, 2, -1, -4 });
        foreach (var outie in output)
        {
            Console.WriteLine($"{outie[0]}, {outie[1]}, {outie[2]}");
        }

        Console.Read();

    }
    private static IList<IList<int>> ThreeSum(int[] nums)
    {
        var lookup = new List<int>(nums);
        var returnList = new List<IList<int>>();

        for (var i = 0; i < nums.Length; i++)
        {
            var result = TwoSum(i, lookup);
            if (result != null)
            {
                var fullResult = new List<int> { nums[i], nums[result[0]], nums[result[1]] };
                fullResult.Sort();
                if (!returnList.Any(b => b.SequenceEqual(fullResult)))
                {
                    returnList.Add(fullResult);
                }
            }
        }
        return returnList;
    }

    private static int[] TwoSum(int thirdnumIndex, List<int> nums)
    {
        var target = nums[thirdnumIndex];

        for (var i = 0; i < nums.Count; i++)
        {
            var comp = (target + nums[i]) * -1;
            if (nums.Contains(comp))
            {
                var indexOfComp = nums.IndexOf(comp);
                if (indexOfComp == i || indexOfComp == thirdnumIndex)
                {
                    return null;
                }

                return new[] { i, indexOfComp };
            }

        }
        return null;
    }
}

推荐阅读