为了账号安全,请及时绑定邮箱和手机立即绑定

【前端面试题】生成[1,2,3,4,5,6,7,8,9]的随机数组

标签:
JavaScript

前言:相对来说这个题目很简单,写这个单纯是为了反思,本人小白一个,正走在变成大神的路上,如有大神偶然路过,勿喷。

今天去面试,遇到了这个题目,因为是比较喜欢的公司,所以有点紧张,思绪凌乱,没写出来,没错我就是这么有出息,尴尬脸。
回到家,赶紧吃了根老冰棍压压惊,认真脸。
整理 了下思路,当时就是因为太急了,失去了平常的节奏,一心只想着怎么写出最终效果,搞笑,那怎么可能嘛,除非是大神,很明显我不是,丧气脸。
不废话了,上代码+思路。

var randarr=new Array();

第一步:当然是声明一个存放随机数的数组啦

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    randarr[i]=num;//把生成的随机数放进数组
}
console.log(randarr)//打印当前数组

第二步:数组里面有1-9,9个值,很明显需要循环,那么在什么条件下循环呢?因为数组是从0计数的,所以循环条件i的值取0-8,即i<9或i<=8。
我在最后打印了下结果,运行结果:[4, 8, 5, 5, 9, 4, 0, 2, 4]
是生成了9个数,但是很明显有3个错误:
1.结果中含有"0"
2.有重复的数字
3.数字没排序
只要我们把这3个问题解决了不就好了,是不是?
第一个是不是最简单呀,柿子要挑软的捏。

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      randarr[i]=num;//把生成的随机数放进数组
    }
}
console.log(randarr)//打印当前数组

第三步:随机数放进数组前先判断下是不是大于0,然而运行结果却是这样的:[8, 8, 5, 4: 4, 5: 8, 6: 3, 7: 5, 8: 1]
什么鬼,只有8个数,噢,是因为有一个值为0,被残忍的关在数组外了,但是它还穿着带有编号的衣服,有编号的衣服就那么多,那怎么办呢?那我们把不在数组内值的衣服都脱掉,给新的符合条件的随机数穿上,阴险脸,来个else

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      randarr[i]=num;//把生成的随机数放进数组
    }else{
      i=i-1;//如果随机数为0的话,就不让它占用i的值
    }
}
console.log(randarr)//打印当前数组

上面为第三步的改进版,啰嗦了点,为了让自己明天还看的懂,值得。
上面运行结果:[6, 2, 6, 4, 3, 1, 5, 8, 3]
好,第一个问题解决了,我们来看第二个问题。
去重,那不就是生成的随机数放进数组之前和数组里面已有的数字比较下,如果都不一样,然后再放进去啊,如果有一个一样的,那是不是也要把它带有编号的衣服脱掉啊,好,看代码。

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      for (var n = 0; n < randarr.length; n++) {//遍历数组中已有数字
        if (num!=randarr[n]) {//依次判断新的随机数是否已在数组中,如果不在把新随机数加进数组
          randarr[i]=num;//把生成的随机数放进数组
        }
      }
    }else{
      i=i-1;//如果随机数为0的话,就不让它占用i的值
    }
}
console.log(randarr)//打印当前数组

运行代码,一个数字也没了!!!!!
哪里出问题了呢?噢,把随机数放进数组的判断出问题了,太心急了。。
现在是不是新的随机数只要不和数组中已有值中任何一个不同都可以放进去了啊?
那怎么解决呢?
那我们加个计数器,如果有一个不相等的话计数器就+1,那计数器最终的值和已有数组的length相等是不是就说明新的随机数和当前数组中所有的值都不一样啊?
那计数器加哪呢?肯定要加在生成随机数循环的里面是吧,因为它每次生成新的随机数时计数器都要清空的不是?好,思路有了,上代码。

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var count=0;//定义一个计数器,并清空
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      for (var n = 0; n < randarr.length; n++) {//遍历数组中已有数字
        if (num!=randarr[n]) {//依次判断新的随机数是否已在数组中,如果不在,计数器+1
          count=count+1;//当新随机数和数组中已有值不相等时,计数器+1
        }
      }
    }else{
      i=i-1;//如果随机数为0的话,就不让它占用i的值
    }
}
console.log(randarr)//打印当前数组

计数器加好了,怎么让它发挥作用呢?
刚才也说了,当计数器的最终值和已有数组的length相等,就说明新的随机数和当前数组中所有的值都不一样,那是不是就可以把新的随机数放进数组里啦?看代码。

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var count=0;//定义一个计数器,并清空
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      for (var n = 0; n < randarr.length; n++) {//遍历数组中已有数字
        if (num!=randarr[n]) {//依次判断新的随机数是否已在数组中,如果不在,计数器+1
          count=count+1;//当新随机数和数组中已有值不相等时,计数器+1
        }
      }
      if (count==randarr.length) {//当计数器最终的值和当前数组的length值相等时
        randarr[i]=num;//把生成的新随机数放进数组
      }else{
        i=i-1;//只要有一个不相等,说明数组中已有,那就不让它占用i的值
      }
    }else{
      i=i-1;//如果随机数为0的话,就不让它占用i的值
    }
}
console.log(randarr)//打印当前数组

上面代码,运行结果:[9, 7, 5, 4, 2, 1, 3, 6, 8]
不容易啊,眼泪都要出来了。
最后一步,给数组排序,大家都知道数组的sort()方法,但是数字排序会出现问题,比如:1,2,11,22进行排序的话它会输出:1,11,2,22 它只会根据第一位数字进行排序,所以我们要加一个排序函数。

//数字排序函数,从小到大是a-b,从大到小是b-a,字母只用sort()
function sortarr(a,b){
    return a-b;
  }

最终的代码:

var randarr=new Array();
for (var i = 0; i<9; i++) {
    var count=0;//定义一个计数器,并清空
    var num=Math.floor(Math.random()*10);//随机生成0-9之间的整数(包括0和9),因为用了floor向下取整
    if (num>0) {//过滤掉随机数为0的情况
      for (var n = 0; n < randarr.length; n++) {//遍历数组中已有数字
        if (num!=randarr[n]) {//依次判断新的随机数是否已在数组中,如果不在,计数器+1
          count=count+1;//当新随机数和数组中已有值不相等时,计数器+1
        }
      }
      if (count==randarr.length) {//当计数器最终的值和当前数组length的值相等时
        randarr[i]=num;//把生成的新随机数放进数组
      }else{
        i=i-1;//只要有一个不相等,说明数组中已有,那就不让它占用i的值
      }
    }else{
      i=i-1;//如果随机数为0的话,就不让它占用i的值
    }
}
console.log(randarr.sort(sortnum))//调用数组数字排序函数打印当前数组

//数字排序函数,从小到大是a-b,从大到小是b-a,字母只用sort()
function sortnum(a,b){
    return a-b;
  }

运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

个人认为,当没有思路时,不妨先从简单的做起,所谓瓜熟蒂落,水到渠成,生活不就是不断发现问题,解决问题吗?


2016年9月13日编辑【延伸】
看了大家的评论,感觉受益匪浅。特此贴上改进版的代码,可以自定义生成min到max的随机数数组

var randarr=new Array(),//声明存储随机数的数组
        minnum=2,//声明数组中最小的数
        maxnum=5,//声明数组中最大的数
        arrlength=maxnum-minnum+1;//数组最终的长度,不懂的同学掰手指算下。。。

for (var i = 0; i < arrlength; i++) {//生成数组的循环
  var count=0,//初始化一个计数器
      num=Math.floor(Math.random()*arrlength+minnum);
      //注意这里的arrlength=maxnum-minnum+1
      //意思是生成一个minnum到maxnum之间的随机数(包括minnum和maxnum)

  for (var j = 0; j < randarr.length; j++) {//遍历当前已有数组
    if (num!=randarr[j]) {//判断新生成的随机数是否已存在数组里
          count=count+1;//如果不一样计数器依次+1
        }
  }
  if (count==randarr.length) {//如果计数器最终的值和当前已有数组的length值相等,说明新的随机数不在数组里
    randarr.push(num);//那就把新的随机数加到数组里
  }else{
    i=i-1;//如果新生成的随机数已在数组里,释放当前i的值
  }
}
//console.log(randarr);//这个是输出没有排序的数组

//为了方便大家看效果,特意排序了下,排序函数上面讲过的哦?
console.log(randarr.sort(function(a,b){return a-b;}));
点击查看更多内容
58人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消