有哪些令人拍案叫绝的算法?
介绍一个简单易懂然后又让你拍案叫绝的算法! 这个算法的代码量很少,却很惊艳。 它就是传说中的 洗牌算法 ! 小技巧:看到一个好答案,想点赞又嫌麻烦,可以双击屏幕自动点,既能鼓舞作者,又能很方便自己下次再看。我用这个方法,已经快速标记 10 来个好文章了。 先来思考一个问题:有一个大小为 100 的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 1 个数? 最简单的方法是利用系统的方法 Math.random() * 100 ,这样就可以拿到一个 0 到 99 的随机数,然后去数组找对应的位置就即可。 接下来在思考一个问题: 有一个大小为100的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 50 个数? 注意数字不能重复! 注意数字不能重复! 注意数字不能重复! 如果根据上面的思路,你第一想法是:随机 50 次不就行了? 但是,这样做有个很明显的 bug :数字是会重复的。 修改一下? 弄一个数组,把每一次随机的数都放到数组里,下一次随机就看这个数组里面有没有这数,有的话就继续随机,直到这个数组里面有 50 个数字就停止。 这样是可以的! 但,还是有个小问题,考虑一下极端情况:有一个大小为100的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 99 个数。 如果按照上面的方法操作