在解决面试问题时
问题 当乘以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)什么是在linq中处理像var num = l.ToString()等临时计算的方法。在Linq中我很困惑我完成它。感谢帮助。
When solving an interview question
Question A six digit number need to be found in such a manner when it is multiplied by an integer between 2 and 9 gives the original six digit number when its digits are reversed.
Example:
Suppose I multiply 219978 * 4 i get 879912 ,when reverse 879912 I will get 219978 back.
I solved it using
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); } } }The original task was to solve it using linq. I have bit confusion in handling temp calculations for example
when i use
var = from l in Enumerable.Range(100000,999999) from i in Enumerable.Range(3,9)What is the way to handle temporary calculations like var num = l.ToString(),etc in linq.It confused me a lot to finish it in Linq.Help is appreciated.
最满意答案
你想要......
// 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的第二个参数是计数 ,而不是结束)。
You want 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); }with first answer (note the inclusion of 9 is taken from your original version of the code, but it may be desirable to use Range(3,8) instead):
109989 x 9 = 989901Optimised version (and correct range):
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 };This reduces the number of strings created, uses integer equality, and correctly uses the range (the second parameter to Range is the count, not the end).
更多推荐
发布评论