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的解决方案?为什么他看起来不喜欢我的
- 有没有办法使它更紧凑
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();