当时写在纸上的程序没有验证输入,出面试公司没多久就忽然想起来这点了,囧啊!面试
不过当时笔试的时候想到写异常处理了。dom
回来上机整理了一下程序,才发现原来还会用到递归的。spa
当时面试官边说边出的题,问他数字是否是连续的他说这点能够忽略,否则下面的程序还能够简化,另外错误提示其实也能够再友好点,好比提示有效范围。blog
若是数据源中的数据自己有重复的话,下面的程序也不适用。递归
代码以下:get
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { //已知一组数字,假设最大为1000个,这里就不写1000个了 List<int> srcArr = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; //输入一个数 输出这组数中指定数量的不重复数字 getDistinctRandomNum(srcArr); } catch (Exception ex) { //记录异常 } } /// <summary> /// 已知一组数字 /// 输入一个数 /// 输出这组数中指定数量的不重复数字 /// </summary> /// <param name="srcArr">数据源</param> static void getDistinctRandomNum(List<int> srcArr) { int maxIndex = srcArr.Count - 1; string inputNumStr = Console.ReadLine();//输入 if (new Regex(@"^\d{1,}$").IsMatch(inputNumStr))//验证是否为数字 { int inputNum = Int32.Parse(inputNumStr); if (inputNum <= 0 || inputNum > maxIndex)//验证范围 { Console.WriteLine("输入的数字超过范围,请从新输入!"); //递归调用 准备下次输入、输出 getDistinctRandomNum(srcArr); } else { List<int> resultArr = new List<int>(); List<int> indexArr = new List<int>(); int tempIndexVal; //生成有效数目范围内的,指定数目不重复随机数 while (resultArr.Count < inputNum) { tempIndexVal = new Random().Next(0, maxIndex); if (!indexArr.Contains(tempIndexVal)) { indexArr.Add(tempIndexVal); resultArr.Add(srcArr[tempIndexVal]); } } //输出 foreach (int item in resultArr) { Console.WriteLine(item); } //递归调用 准备下次输入、输出 getDistinctRandomNum(srcArr); } } else { Console.WriteLine("输入不是零或正整数,请从新输入!"); //递归调用 准备下次输入、输出 getDistinctRandomNum(srcArr); } } } }