c# - 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;
}
}
解决方案
使用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;
}
}
推荐阅读
- php - 如果成员不再属于组,则从 db 中删除行
- reactjs - 反应:通过将输入状态设置为空数组来搜索表单输入未从状态中清除
- angular - 使用 useFactory 提供服务时未触发 ngOnDestroy
- python - 使用 pandas/dataframe 基于 2 列计算加权平均值
- java - jooq 使用 oracle 文本包含查询
- python - 如何在 Python 和 R 之间交换 Msgpack 文件?
- html - 是否可以用 html 和 css 制作这些箭头?
- node.js - 如何让外部服务访问我的本地环境
- php - IP 日志显示一些奇怪的东西
- python - Django中的电子邮件验证