在 pdd 的面试中遇到让手写一个函数实现:1-50有序数组中的元素随机输出。感觉很简单的题目,由于面试官说不可以直接使用 Random ,当时觉得应该就是 Random 的源码实现,但是由于没有看过 Random 的源码,所以一直没想到思路。现在将该题的解题思路记录下来。
-
思路:
1、从数组的最后一个位置(假设下标是n)开始向前扫描,然后随机生成一个 0 到 n 之间的随机数,假设该随机数是 r1,然后将数组最后一个位置(下标 n)与 r1 位置互换;
2、之后开始扫面下一个数(下标为 n - 1),然后随机生成一个 0 到(n - 1) 之间的随机数。假设该随机数是 r2,然后将数组倒数第二个位置(下标为 n - 1)与 r2 位置互换;
3、然后继续扫面下一个数(下标为 n - 2),就这样一直迭代下去。
在这个迭代过程中,可以保证扫面点左边的数字都是尚未确定位置的,而右边的数字都是已经安排好位置的。如下图所示使用该算法对数组 {1,2,3} 进行乱序: