面试原题:实现填充1-100到一个容器为100的数组中,不能重复,数组只可以定义一个。
这是我上半年面试时遇到的一道题,当时第一次遇到就做出来,很有成就感,面试官现场给了我五分钟 ,花了三分钟想出来描述给他听。不过前些时候学LinQ又遇到了一种方法,下午正好有空整理了下(国庆来临,除了开会的别的基本都提前走了,办公室就几个人,也都不干活了)。
方法一:
思想:先将数组按顺序从1到100填充,然后对下标进行随机抽取互换。例如第一次在0-98中选一个随机 数作为下标,将数组这个下标的值跟下标为99的互换,于是第100数则为随机数;第二次在0-97中选一个 随机数作为下标,将数组这个下标的值跟下标为98的互换,于是第99数则为随机数,最后两个位置的数 就都是随机数;以此规律循环,直到最后所有的都是随机数。代码如下:
思想:运用LinQ,首先生成1-100的整数序列,然后根据随机数排序;
代码只有两句,如下:
这是我上半年面试时遇到的一道题,当时第一次遇到就做出来,很有成就感,面试官现场给了我五分钟 ,花了三分钟想出来描述给他听。不过前些时候学LinQ又遇到了一种方法,下午正好有空整理了下(国庆来临,除了开会的别的基本都提前走了,办公室就几个人,也都不干活了)。
方法一:
思想:先将数组按顺序从1到100填充,然后对下标进行随机抽取互换。例如第一次在0-98中选一个随机 数作为下标,将数组这个下标的值跟下标为99的互换,于是第100数则为随机数;第二次在0-97中选一个 随机数作为下标,将数组这个下标的值跟下标为98的互换,于是第99数则为随机数,最后两个位置的数 就都是随机数;以此规律循环,直到最后所有的都是随机数。代码如下:
const int N = 100;
int[] array = new int[N];
for (int i = 0; i < N; i++)
{
array[i] = i + 1;
}
for (int j = 1; j < N; j++)
{
int randomIndex = new Random(j * array[N - j]).Next(0, N - j);
//first method
int temp = array[N - j];
array[N - j] = array[randomIndex];
array[randomIndex] = temp;
//second method
//array[N - j] = array[N - j] ^ array[randomIndex];
//array[randomIndex] = array[N - j] ^ array[randomIndex];
//array[N - j] = array[N - j] ^ array[randomIndex];
//third method
//array[N - j] = array[N - j] + array[randomIndex];
//array[randomIndex] = array[N - j] - array[randomIndex];
//array[N - j] = array[N - j] - array[randomIndex];
}
方法二:
思想:运用LinQ,首先生成1-100的整数序列,然后根据随机数排序;
代码只有两句,如下:
int[] array = new int[N];
array = Enumerable.Range(1, N)
.OrderBy(n => (new Random(n).Next()))
.ToArray<int>();
方法一附带了两种不需要第三个变量互换值的方法,在写例子时由于边界没考虑全面,当array[N - j]和array[randomIndex]为同一个变量时,导致另外两个互换值的方法失效如下:
//second method
//array[N - j] = array[N - j] ^ array[randomIndex];
//array[randomIndex] = array[N - j] ^ array[randomIndex];
//array[N - j] = array[N - j] ^ array[randomIndex];
当下标一样时,array[N - j]和array[randomIndex]为同一个变量,第一行为0,同时array[N - j]值本身都变成了0,所以只要相等时,互换变量就都变成了0;另一种也差不多,如下:
//third method
//array[N - j] = array[N - j] + array[randomIndex];
//array[randomIndex] = array[N - j] - array[randomIndex];
//array[N - j] = array[N - j] - array[randomIndex];
看第二行,如果两个是同一个变量,值相减就会变为0,第三行就是0-0还是0;由于我知道思想,自以为一会儿就写出来的,说明知道和写出来还是有差距的,平时还是要多写程序的。希望能对大家有帮助。