4

面接の質問を解くとき

質問 6 桁の数に 2 から 9 までの整数を掛けると、元の 6 桁の数の桁が逆になるような方法で 6 桁の数を見つける必要があります。

例:

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 で処理する方法は何ですか。Linq でそれを完了するのはとても混乱しました。

4

2 に答える 2

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 };

これにより、作成される文字列の数が減り、整数の等価性が使用され、範囲が正しく使用されます ( to の 2 番目のパラメーターRangeは、 end ではなくcountです)。

于 2009-10-17T12:10:14.237 に答える
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、Multiplier = 9 }
{ MultipliedNumber = 879912、OriginalNumber = 219978、Multiplier = 4 }

Enumerable.Range には注意してください - この質問に回答した 1 人が、問題の説明で要求された 2 つの数値を除外するという間違いを犯したようです。

于 2009-10-17T16:06:05.953 に答える