首页 > 试题广场 >

无重复数组

[编程题]无重复数组
  • 热度指数:27121 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请补全JavaScript代码,实现一个函数,要求如下:
1. 根据输入的数字范围(包括)和随机数个数生成随机数
2. 生成的随机数存储到数组中,返回该数组
示例1

输入

getUniqueNums(2,10,4)

输出

[4,6,2,8]
const _getUniqueNums = (start,end,n) => {
                // 补全代码
                let arr = [];
                while(arr.length < n ){
                   let val = Math.floor(Math.random() * (end - start + 1) + start)
                   if (!arr.includes(val)) arr.push(val)
                }
                return arr;
}
发表于 2021-12-30 14:08:08 回复(2)

使用 set集合 更容易解决一些

const _getUniqueNums = (start, end, n) => {
                // 补全代码
                let result = []

                for (let i = 0; i < n; i++) {
                    result.push(Math.floor(Math.random() * (end - start + 1)) + start)
                }

                return [...new Set(result)]
            }
发表于 2023-08-24 11:06:56 回复(0)
const _getUniqueNums = (start,end,n) => {
                // 补全代码
                let arr = [];
                while(arr.length<n){
                    let temp = Math.ceil(Math.random()*(end-start)+start-1);
                    if(arr.indexOf(temp)==-1){
                        arr.push(temp);
                    }
                }
                return arr;
                
            }

发表于 2022-05-29 21:43:48 回复(0)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>

        <script>
            const _getUniqueNums = (start,end,n) => {
                // 补全代码
                var arr = new Array()
                while(n > 0){
                    let ch = end - start;
                    let num =  Math.round(Math.random()*ch + start);
                                         if(arr.indexOf(num)  == -1){
                        arr.push(num);
                    }else{
                        continue;
                    }
                    n--;
                }
                return arr;
            }
        </script>
    </body>
</html>

发表于 2022-03-22 13:07:11 回复(0)
const _getUniqueNums = (start,end,n) => {
                // 补全代码
                // 创建随机数组
                let randomN = Array(n).fill(start).map(x => x + Math.random()*(end-start))
                // 去重
                return [... new Set(randomN)]
            }

发表于 2023-01-16 22:17:01 回复(1)
            const _getUniqueNums = (start,end,n) => {
                // 补全代码
                let arr = [],
                  min = Math.ceil(start),
                  max = Math.floor(end);
                while(arr.length < n) {
                    arr.push(Math.floor(Math.random() * (max - min + 1)) + min)
                    arr = [...new Set(arr)]
                }
                return arr
                
            }

发表于 2022-08-31 18:03:32 回复(0)
return Array.from(new Array(n),_=>Math.floor(Math.random() * (end - start + 1) + start))
发表于 2022-06-27 15:40:33 回复(0)
<script>
<script>
        const _getUniqueNums = (start, end, n) => {
            // 补全代码
            let arr = [];
            while (arr.length < n) {
                value = Math.floor(Math.random() * (end - start + 1)) + start;
                arr.push(value);
                quchong();
            }
            function quchong() {
                for (var i = 0; i < arr.length; i++) {
                    for (var j = i + 1; j < arr.length; j++) {
                        if (arr[i] == arr[j]) {
                            //如果两个元素相等,则删除j对应的元素
                            arr.splice(j, 1);
                            //删除了j位置的元素,后面元素会自动补位,此时j位置元素不会再被比较
                            //因此需要再比一次j位置元素,使j--
                            j--;
                        }
                    }
                }
            }
            return arr;
        }
        </script>

发表于 2022-03-27 14:37:59 回复(0)
set固然方便,但reduce函数也需要熟悉和掌握
1.通过Math.floor(Math.random(end-start+1)+end)生成随机数
2.利用数组的reduce函数去除
 const _getUniqueNums = (start,end,n) => {
                // 补全代码
              let arr=Array(n).fill(0);
              let result= arr.reduce((pre,now)=>{
                now=randomNum(start,end);
                if(!pre.includes(now)){
                       return pre.concat(now);
                }
                 return pre;
               },[])
             return result;
                
            }
            const randomNum=(min,max)=>{
                return Math.floor(Math.random()*(max-min+1)+min);
            }

发表于 2024-11-17 18:20:35 回复(0)
 let arr = []
                while(arr.length !== n) {
                    let random = Math.floor(Math.random()*(end - start + 1)) + start
                    if (arr.indexOf(random) == -1) {
                        arr.push(random)
                    }
                }
                return arr
发表于 2023-01-19 14:19:27 回复(0)
        <script>
            const _getUniqueNums = (start,end,n) => {
                // 补全代码
                let array = []
                for (let i = 0; i < n; i++){
                    let random = Math.round(Math.random() *(end - start) + start)
                    array.push(random)
                }
                return array
            }
        </script>
发表于 2022-12-24 16:24:21 回复(0)
const _getUniqueNums = (start,end,n) => {
                // 补全代码
                const arr = new Array(end-start+1)
                const res = []
                // 生成从start到end的数组
                for(let i = 0;i < arr.length;i++){
                    arr[i] = Number(i)+start
                }
                for(let i = 0;i < n;i++) {
                    // 从arr中随机取出一个数字
                    res[i] = arr.splice(Math.floor(Math.random() * arr.length),1)[0] 
                }
                return res
            } 
发表于 2022-08-24 22:41:53 回复(0)
// 方法一(map)
const _getUniqueNums = (start,end,n) => {
    const arr = []
    const randomNum = () => {
        const data = Math.floor(Math.random() * (end - start + 1)) + start
        return arr.includes(data) ? randomNum() : data
    }
    Array(n).fill('').map(() => arr.push(randomNum()))
    return arr
}

// 方法二(while(true))
const _getUniqueNums = (start,end,n) => {
    const arr = []
    while(true) {
        const data = Math.floor(Math.random() * (end - start + 1)) + start
        !arr.includes(data) && arr.push(data)
        if (arr.length >= n) return arr
    }
}


发表于 2022-08-15 20:21:56 回复(0)
const _getUniqueNums = (start,end,n) => {
                // 补全代码
                var arr = [];
                for(var i = 0;i<n;i++){
                    var num = Math.random()*(end-start)+1 ;  // 扩充范围
                    if (arr.indexOf(num) !== -1) {  // 判断数组中是否有该数,如果有那就退出本次循环,并且将 i-1 用来回到本次开始的状态
                        i--;
                        continue;
                    } else {
                        arr.push(num);
                    }
                }
                return arr;
            }
发表于 2022-07-25 21:00:01 回复(0)
Math.round(Math.random()*(start,end));这样取好像也可以
发表于 2022-07-03 17:01:00 回复(0)
        <script>
            const _getUniqueNums = (start,end,n) => {
                // 补全代码
                // 1. 排除n大于数字范围的情况
                if (n > end + 1 - start) return [];
                // 2. 其他情况
                var res = [];
                for (var i = 0; i < n; i++) {
                    var num;
                    // 循环条件控制新数组中不含有相同元素
                    do {
                        // 获取start ~ end之间的随机整数
                        num = Math.floor(Math.random() * (end + 1 - start)) + start;
                    } while(res.includes(num));
                    res.push(num);
                }
                return res;
            }
        </script>

发表于 2022-03-20 13:26:12 回复(0)
const _getUniqueNums = (start,end,n) => {
    // 补全代码
    let arr=[]
    while(arr.length<n){
        let num=Math.floor(Math.random() * (end - start + 1) ) + start
        if(arr.indexOf(num)==-1) arr.push(num)
    }
    return arr
}

发表于 2021-12-07 20:59:45 回复(1)
const _getUniqueNums = (start,end,n) => {
    // 补全代码
    if(n>end - start + 1)return[]
    let arr = []
    for (let i = 0; i < n; ++i) {
        let num
        do {
            num = Math.round(Math.random() * (end - start + 1)) + start
        } while (arr.includes(num))
            arr.push(num)
    }
    return arr
}

发表于 2021-12-02 19:55:49 回复(2)
      const _getUniqueNums = (start,end,n) => {//2 10 4
        var setArr=[],arr=[];
        for(let i=0;i<end*10;i++){//获得足够长的数组长度,免得去重后长度不足
          var randNum=Math.floor(Math.random()*(end-start))+start;
          arr.push(randNum);
        }
        setArr=Array.from(new Set(arr));//去重后的数组
       
        return setArr.slice(0,n);//截取前n个元素并返回它
      }


发表于 2025-04-08 18:52:30 回复(0)
function suiji(ss,ee){
                return Math.floor(Math.random()*(ee+1-ss))+ss
            }
            const _getUniqueNums = (start,end,n) => {
                // 补全代码
                let arr=[]
                for(let i=0;i<=n-1;i++){
                    arr[i]=suiji(start,end)
                    for(let j=0;j<i;j++){
                        while(arr[i]!=arr[j]){
                            break
                        }
                    }                    
                }return arr
            }原生易懂笨方法
发表于 2024-12-04 14:56:36 回复(0)