2009-10-17 68 views
4

在解決一個面試問題處理臨時計算中的LINQ

問題 一個六位數字需要在當它被2和9之間的整數相乘的方式被發現給出原六當它的數字相反時,

例子:

想我乘219978 * 4,我得到879912,反向879912時,我會得到219978回來。

我解決它使用

for (long l = 100000; l < 999999; l++) 
{ 
var num = l.ToString(); 

for (int i = 3; i < 9; i++) 
{ 
    var mul = l * i; 
    string str = mul.ToString(); 
    char[] splitDigits = str.ToCharArray(); 
    string reversedDigit = 
    new string(splitDigits.Reverse().ToArray()); 

    if (reversedDigit.CompareTo(num) == 0) 
    { 
     Console.WriteLine("{0} * {1}= {2}, 
     when multiplied {3} ", num, i, mul,reversedDigit); 

    } 

} 
} 

原來的任務是使用LINQ來解決它。我有點困惑在處理溫度計算例如

當我使用

var = from l in Enumerable.Range(100000,999999) 
     from i in Enumerable.Range(3,9) 

什麼是處理臨時的計算像VAR NUM = l.ToString()等在linq.It困惑我的方式很多要完成Linq.Help表示讚賞。

+0

你有工作機會嗎? – 2009-10-17 12:10:53

+0

等待結果。幾乎十二個難題被要求使用linq解決。我只解決了其中的五個。 :(現在大多數的面試問題都是解謎題。 – user190560 2009-10-17 12:15:32

+0

注意:如果你願意,我會添加一個優化版本。 – 2009-10-17 12:34:54

回答

5

你想let ...

// NOTE: buggy; see below 
    var qry = from l in Enumerable.Range(100000, 999999) 
       from i in Enumerable.Range(3, 9) 
       let s = l.ToString() 
       let t = (l * i).ToString() 
       where s.Reverse().SequenceEqual(t) 
       select new { l, i }; 

    var a = qry.First(); 
    Console.WriteLine("an answer..."); 
    Console.WriteLine("{0} x {1} = {2}", a.l, a.i, a.l * a.i); 

    Console.WriteLine("all answers..."); 
    foreach (var row in qry) 
    { 
     Console.WriteLine("{0} x {1} = {2}", row.l, row.i, row.l * row.i); 
    } 

與第一個答案(注意列入9是從原始的代碼版本拍攝,但可能需要使用Range(3,8)代替):

109989 x 9 = 989901 

優化版本(和正確的範圍內):

var qry = from l in Enumerable.Range(100000, 999999 - 100000) 
       let s = l.ToString() 
       let sReversed = new string(s.Reverse().ToArray()) 
       let wanted = int.Parse(sReversed) 
       from i in Enumerable.Range(3, 8 - 3) 
       where l * i == wanted 
       select new { l, i }; 

這減少創建串的數量,使用整數平等,和正確地使用範圍(至Range的第二個參數是計數,而不是結束)。

+0

寫下答案Yuiry :)我很好奇看到它。 – Gregory 2009-10-17 12:15:02

+0

我只是不知道解決所有這些問題,你必須讓人們在一段時間內爲自己弄明白這個問題 – 2009-10-17 12:16:00

+0

@Yuriy - 注意他已經有了一個工作實現......所以我不確定這是多麼的一個問題;該問題超過了臨時值('let')。 – 2009-10-17 12:20:34

1

這裏的另一個解決方案相匹配的問題陳述了一些輔助方法透明度(可能被轉移到原來的LINQ查詢):

private static IEnumerable<int> SixDigitNumbers = Enumerable.Range(100000, (999999 - 100000)); 
    private static IEnumerable<int> Multipliers = Enumerable.Range(2, 8); 

    static void Main(string[] args) 
    { 

     var Solutions = from OriginalNumber in SixDigitNumbers 
           from Multiplier in Multipliers 
           let MultipliedNumber = (OriginalNumber * Multiplier) 
           where MultipliedNumber < 999999 && ResultIsNumericPalindrome(OriginalNumber, Multiplier) 
           select new { MultipliedNumber, OriginalNumber, Multiplier }; 


     var AllSolutions = Solutions.ToList(); 

    } 

    private static string Reverse(string Source) 
    { 
     return new String(Source.Reverse().ToArray()); 
    } 

    private static bool ResultIsNumericPalindrome(int Original, int Multiplier) 
    { 
     return (Original.ToString() == Reverse((Original * Multiplier).ToString())); 
    } 

這裏是所有的解決方案:

{ MultipliedNumber = 989901,OriginalNumber = 109989,合約乘數= 9}
{MultipliedNumber = 879912,OriginalNumber = 219978,合約乘數= 4}

小心Enumerable.Range - 我看到回答這個問題的一個人犯了排除問題陳述中要求的兩個數字的錯誤。

+0

謝謝Robert.Acknowledged。 – user190560 2009-10-17 16:24:00