Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回列表的微观最佳和最优雅的方式是什么<;字符串>;在其他列表中仅出现一次的元素的数量<;字符串>;_C#_.net_Algorithm - Fatal编程技术网

C# 返回列表的微观最佳和最优雅的方式是什么<;字符串>;在其他列表中仅出现一次的元素的数量<;字符串>;

C# 返回列表的微观最佳和最优雅的方式是什么<;字符串>;在其他列表中仅出现一次的元素的数量<;字符串>;,c#,.net,algorithm,C#,.net,Algorithm,这是我今天面试的一个问题: 给定字符串列表,只返回唯一字符串的列表 我很好奇飞碟认证的答案是什么 我自己的回答是 public static List<string> sans_repeats ( List<string> input ) { Dictoinary<string,int> counter = new Dictionary<string,int>(); List<string> output = new

这是我今天面试的一个问题:

给定字符串列表,只返回唯一字符串的列表

我很好奇飞碟认证的答案是什么

我自己的回答是

public static List<string> sans_repeats ( List<string> input ) 
{
    Dictoinary<string,int> counter = new Dictionary<string,int>();
    List<string> output = new List<string>();
    foreach ( string S in input ) 
    {
       if ( counter.HasKey(S) ) counter[S] = 1;
       else ++count[S];
    }     
    foreach ( KeyValuePair<string,int> entry in counter ) 
       if ( entry.Value == 1 ) output.Add(entry.Key);
    return output;
}
公共静态列表无重复(列表输入)
{
听写计数器=新字典();
列表输出=新列表();
foreach(输入中的字符串S)
{
如果(计数器HasKey)计数器=1;
else++计数[S];
}     
foreach(计数器中的KeyValuePair条目)
if(entry.Value==1)output.Add(entry.Key);
返回输出;
}
采访中说

“嗯,这是一种方法……”

用一种听起来像是居高临下的声音,好像我做错了什么

  • 逻辑上有什么错误吗
  • 有没有一种方法可以实现更高效的内存和处理解决方案
  • 面试官是否可能在寻找一个类似LINQ的解决方案?为什么他看起来不喜欢我的
  • 有没有办法使它更紧凑

根据更新的问题,以下是LINQ的一种方法:

var src = new List<string>() { "dog", "cat", "elephant", "dog", "dog" } ;
src.GroupBy(x => x).Where(y => y.Count() == 1).ToList();
var src=new List(){“狗”、“猫”、“大象”、“狗”、“狗”};
GroupBy(x=>x).Where(y=>y.Count()==1.ToList();

最简单的方法是使用内置功能:

List<string> distinctList = input.Distinct();
List distinctList=input.Distinct();

或者,检查当前项是否已存在于输出列表中,如果存在,则继续:

List<string> output = new List<string>();
foreach (string S in input) 
{
    if (output.Contains(S)) continue;       
    output.Add(S);
}
列表输出=新列表();
foreach(输入中的字符串S)
{
如果(输出包含)继续;
输出。添加(S);
}
编辑

根据您的评论,您只需要出现一次的项目:

Dictionary stringCount=new Dictionary();
foreach(输入中的字符串S)
{
if(stringCount.ContainsKey)
{
stringCount[S]++;
}
其他的
{
stringCount.Add(S,1);
}       
}
var output=stringCount.Where(x=>x.Value==1.ToList();

>P>因为这是一个面试问题,你需要考虑面试官对这个问题的要求。
  • 如果他想知道你的LINQ技能,你应该给出LINQ代码。(和其他答案一样)

  • 如果他想测试您的算法,您需要编写纯C风格的程序,而不是使用内置库。在这种情况下,您的代码可以得到改进,因为它消耗的内存比预期的要多。可以优化程序中的变量
    输出
    。输入参数已包含所有字符串,无需再次复制。另外,
    计数器
    是一个过度杀伤,您只需要一个
    int[]
    来存储元素的计数

  • 有时面试官想测试面试者解决问题的方式。当你被问到这个问题时,你可以问面试官:

    (1) 返回的列表应该与输入列表具有相同的引用,还是创建一个新列表是可以接受的

    (2) 一个元素最多出现多少次?如有必要,使用
    byte[]
    来存储计数,而不是
    int[]


  • Linq是一个很好的选择,但是如果您想要一个集合,那么当
    HashSet
    可能更合适时,为什么要使用
    Dictionary

    var strings = new[] { "a", "a", "b", "c" };
    var hash = new HashSet<string>(strings);
    hash.Dump(); // a, b, c
    
    var strings=new[]{“a”、“a”、“b”、“c”};
    var hash=新的HashSet(字符串);
    hash.Dump();//a、 b,c
    
    这里是另一种有效的方法,使用这样一个事实,即方法实际上添加了项,并且仅当该项不在集合中时才返回true。代码是不言自明的

    var uniqueSet = new HashSet<string>();
    var duplicateSet = new HashSet<string>(input.Where(item => !uniqueSet.Add(item)));
    var output = input.Where(item => !duplicateSet.Contains(item)).ToList();
    
    var uniqueSet=newhashset();
    var duplicateSet=newhashset(input.Where(item=>!uniqueSet.Add(item));
    var output=input.Where(item=>!duplicateSet.Contains(item)).ToList();
    
    如果您添加到列表中此字符串的字符串索引中,它将是唯一的,您也可以使用新的GUID()+yourstringCan您可以详细说明“列表中唯一字符串”的含义吗?我自己很好奇。@Waqarhmed示例:{“dog”、“cat”、“elephant”、“dog”、“dog”}->{“cat”、“elephant”}哦,您是指列表中只出现一次的元素,右图:P只是我的观点:作为一名面试官,我可能期待LINQ的解决方案,并对绩效进行评论。它可能效率较低(但不是那么高,它也是线性的),但性能的轻微改进并不是每次使用集合时“重新发明轮子”和编写自定义函数的理由。我可能把问题的措辞弄错了。我的意思是返回的列表只包含在原始列表中出现一次的字符串。啊,太棒了!但是,考虑到LINQ子句的非描述实现,这是否有效?从时间上看,我认为您可以确定这一点。如果底层结构不是
    ICollection
    (您不知道),则调用
    Count()
    可能会非常昂贵。所以我更喜欢
    !y、 跳过(1)。Any()
    请参见。在调用
    列表之前,不应该有类似
    的内容。选择(g=>g.Key)
    input.Distinct()
    IEnumerable
    我可能没有正确表达我的问题。我说的是一个过程,如果元素在第一个字符串中恰好出现一次,则只向第二个字符串中添加元素。@Candide因此请在之后使用
    .ToList()
    。@user5572578,true。不过,结尾有点“Linq-y”。你会如何使用
    byte[]
    来存储计数?@Callumlington如果我被告知所有元素最多出现100次。这只是一个例子。我知道,我只是想理解为什么
    byte[]
    很重要。为什么是100次?@Callumlington,没那么重要。但是如果你在面试中提到这一点的改进,面试官可能会认为你在开始编码之前总是仔细而全面地考虑。
    var uniqueSet = new HashSet<string>();
    var duplicateSet = new HashSet<string>(input.Where(item => !uniqueSet.Add(item)));
    var output = input.Where(item => !duplicateSet.Contains(item)).ToList();