面试题有一道题如下: 用程序在字符串 “5678910111314151617181920” 找出差哪位???
今天自己在网上找资料实现了一把!
第一步:编写应用程序
1 static void Main(string[] args) 2 { 3 Console.WriteLine("返回第一个数是:" + FindMissingNumberInString("78910111314151617")); 4 5 Console.WriteLine("返回第二个数是:{0}", FindMissingNumberInString("9899100101103104105106")); 6 7 Console.WriteLine("返回第三个数是:{0}", FindMissingNumberInString("9989991000100210031004")); 8 9 Console.ReadKey(); 10 }
第二步:创建公用方法 FindMissingNumberInString(string s)
1 // FindMissingNumberInString 2 public static int FindMissingNumberInString(string s) 3 { 4 int returnResult = 0; 5 // i 从 1 开始,表示把字符串从一位数开始拆 ,比如”78910111314151617“ 拆为:7,8,9。。。。。 6 // i 累加为2时:表示拆为 2位数,拆为:78,91,01,11。。。。。 7 // i 累加为3时:表示拆为 3位数,拆为:789,101,113。。。。。 8 for (int i = 1; i < 4; i++) 9 { 10 int[] number = GetNumbersFromString(s,i); 11 int result; 12 if (FindMissingNumber(number, out result)) 13 { 14 returnResult = result; 15 } 16 } 17 return returnResult; 18 }
第三部:创建拆分字符串的方法,并保存到List<int>() 集合中
1 // 拆分字符串的方法 GetNumbersFromString 2 public static int[] GetNumbersFromString(string s,int i) 3 { 4 var resultList = new List<int>(); 5 int index = i; 6 // 根据 i 来截取字符串的位数 7 int number = int.Parse(s.Substring(0, i)); 8 // 保存到集合里面 9 resultList.Add(number); 10 11 while (index < s.Length) 12 { 13 string part; 14 number++; 15 i = number.ToString().Length; 16 if (s.Length - index < i) 17 part = s.Substring(index); 18 else 19 part = s.Substring(index, i); 20 resultList.Add(int.Parse(part)); 21 index += i; 22 } 23 24 return resultList.ToArray(); 25 }
第四步:验证、比较、找出 漏写的哪位数
1 // 验证 缺哪位数的方法 2 // 因为 前一位比后一位小1,所以拿后一位减去前一位正确情况等于1,等于2是表示差的就是这位数,保存下来当返回结果 3 public static bool FindMissingNumber(int[] number,out int result) 4 { 5 result = 0; 6 int? found = null; 7 for (int i = 1; i < number.Length; i++) 8 { 9 switch (number[i] - number[i - 1]) 10 { 11 case 1: 12 break; 13 case 2: 14 if (found == null) 15 found = number[i] - 1; 16 else 17 return false; 18 break; 19 default: 20 break; 21 } 22 } 23 if (found.HasValue) 24 { 25 result = found.Value; 26 return true; 27 } 28 return false; 29 }
效果
OK 搞定 只要有规律,并且是数字都可以找出漏写的哪位数;