当时写在纸上的程序没有验证输入,出面试公司没多久就突然想起来这点了,囧啊!
不过当时笔试的时候想到写异常处理了。
回来上机整理了一下程序,才发现原来还会用到递归的。
当时面试官边说边出的题,问他数字是不是连续的他说这点可以忽略,不然下面的程序还可以简化,另外错误提示其实也可以再友好点,比如提示有效范围。
如果数据源中的数据本身有重复的话,下面的程序也不适用。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 |
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); } } } } |
原文:http://www.cnblogs.com/xuezhizhang/p/3549798.html