朋友们,还有另一种情况需要解决。我在没有申请Linq的情况下正在努力。但是如果你在Linq分享你的代码,我希望这是学习Linq的好机会。
它被称为 FLAMES
F - 朋友
L - 情人
A - Admirer
M - Marry(丈夫)E - Enemy
S - 姐姐
问题描述:
将给出两个名字(男性,女性)。我们必须删除这两个名字的共同字母。然后我们必须在从两个名字中删除共同字符后计算剩余字母的数量。最后,我们必须迭代字符串FLAMES并删除FLAMES中的字母,直到我们达到单个字符为止。剩下的单个字符显示了这种关系。我将在以下示例中解释该过程的更多细节。(忽略大小写和空格)。
示例:
第1步
的
的Male : Albert
Female : Hebarna
的
字母“a”,“e”,“b”在两个名称中都很常见。
(从两个字符串中删除这些字母,即使名称“Hebarna”包含两个“a”,您也可以从两个字符串中单击“a”,因为名称“Albert”只有单个“a”)。
结果字符串是 的 的
的Male : $ l $ $ r t
Female: H $ $ $ r n a
的
第2步:
计算两个字符串中的剩余字母。
数:7
第3步:
使用计数我们必须以下列方式迭代字符串“FLAMES”
F L A M E S
1 2 3 4 5 6
7
(Here the count 7 ends at F ,so strike F)
你会得到
$ L A M E S
(如果是最后一个字母(“S”),则从下一个字母开始计数(它不应该被击出)然后从第一个字母“F”开始,如果“F”尚未被击中。
$ L A M E S
(igonre) 1 2 3 4 5
(ignore) 6 7
在计算过程中,请不要考虑外出字母。
$ L $ M E S
1 2 3
ignore 4 ignore 5 6 7
“s”将被击中。
$ L $ M E $
ignore 1 ignore 2 3
4 ignore 5 6
7
“L”将被击中
$ $ $ M E $
ignore 1 2 ignore
ignore ignore ignore 3 4 ignore
5 6
7
最后“M”将被击中。然后只有剩下的字母是“E”所以albert是herbana的敌人。
更新 Lettter“r”在这两个名字中也很常见.I forgor可以点击它。这个过程与解释的相同。谢谢指出它。
答案 0 :(得分:2)
var count = male.Length + female.Length - male.Intersect( female ).Count();
while (flames.Length > 1)
{
flames = string.Join( '', flames.Where( (c,i) => i != (count % flames.Length) -1 ).ToArray() );
}
答案 1 :(得分:2)
可以预先计算迭代通过火焰字母并逐个删除的最后一个计算部分。
public static Char GetChar(int diff) {
var idx = (diff - 1) % 60;
return "efefmeaelmaafmfaflefefeemsasamfmfallslslesmsasmmaelmlaslslfs"[idx];
}
有些事情可以在没有linq的情况下完成......除非我完全搞砸了。
答案 2 :(得分:2)
Step1和Step2
var firstLookup = firstName.ToLookup(c => c.ToLower());
var secondLookup = secondName.ToLookup(c => c.ToLower());
var allChars = firstLookup.Keys.Union(secondLookup.Keys);
int count =
(
from c in allChars
let firstCount = firstLookup[c].Count()
let secondCount = secondLookup[c].Count()
select
firstCount < secondCount ? secondCount - firstCount :
firstCount - secondCount
).Sum()
Step3(未经测试)
List<char> word = "FLAMES".ToList();
while (word.Count > 1)
{
int wordCount = word.Count;
int remove = (count-1) % wordCount;
word =
word.Select( (c, i) => new {c, i =
i == remove ? 0 :
i < remove ? i + wordCount + 1 :
i})
.OrderBy(x => x.i)
.Select(x => x.c)
.Skip(1)
.ToList();
}
char result = word.Single();