现有一个长度为10的数组,数组中的每个元素为0-1000的随机数字,现请将此数组按升序排列并打印在页面上,且不能有重复数字。
题目分析:
查看题目,我们发现题目有如下几个个要求:
- 获取随机数组
- 将数组升序排列
- 将数组去重
但是还有一个隐藏要求。因为进行去重操作后,数组的长度有可能会减少。由于题目要求输出长度为10的数组。所以我们要在最后进行最后一步操作:
- 将数组补位
步骤分析:
-
获取随机数组
获取一个空数组arr,并建立一个for循环,循环执行10次,每执行一次生成一个0-1000的一个随机数并赋值给arr,并用concat();方法拼接十次,生成一个新数组。最后将其封装成一个函数。var arr = []; function getRandomNumber(){ for(var i = arr.length,num; i < 10; i++){ num = Math.floor(Math.random()*1001); var arr2 = [num]; arr = arr.concat(arr2); } return arr; } // console.log(getArr); //查看获取的随机数数组
-
将数组升序排列
排序的方法有很多,常用的有冒泡排序,快速排序,插入排序等等。这里我们选择比较简单的冒泡排序。 冒泡排序的算法也很简单,首先我们先建立一个两层循环,外循环和内循环执行的都是第一个数和第二数比较,第二个数与第三个数比较……虽然他们执行的过程都相同,但是嵌套在一起就很有意思了:
外循环先获取第一个数字,然后进入内循环,内循环将这个数字和第二数比较,第三个数、第四个数……一直到最后一个数,然后内循环执行完毕,再回到外循环,获取第二个数字,然后在进入内循环,然后内循环将这个数字和剩下的数字依次比较……
当外循环获取完第10个数时,循环结束
内循环除了比较大小外,还要进行换位操作。因为我们要进行升序操作,当数字大于被比较的数字时,进行两个数的调换。
两个数进行调换时,不能直接调换。例如:var a = 1; var b =2; a = b; b = a; console.log(a,b);//输出结果都为2,并没有实现两个数互换。
而正确的做法是应该是再建立一个空变量temp,然后将第一个数放到空变量中,第二个数传给第一个数的变量,然后再将temp存放的数传给第二个 数,这样就实现了两个数之间的交换。
这就像两杯饮料,一杯雪碧,一杯可乐。没有第三个被子的帮助下,是不能完成雪碧和可乐互相调换。
正确写法:
var a = 1; var b =2; var temp = a; a = b; b = temp; console.log(a,b);//输出结果为2和1,实现两个数互换。
mySort(){ for(var x = 0;x < getArr.length;x++){ for(var y = x + 1; y < getArr.length;y++){ if(getArr[x]>getArr[y]){ var temp = getArr[x]; getArr[x] = getArr[y]; getArr[y] = temp; } } } return getArr; } // console.log(sort());
-
将数组去重
去重的方法也有很多,这里我们也选用一个比较简便的方法。 先声明一个空数组,遍历排序后的数组,遍历出的每一个数与新数组的值比较,如果没有,即索引号(下标)的值为-1,则将该数字用push方法添加到新数组尾部,最终生成一个去重后的数组。//去重 var gotArr = mySort(); function norepeat(){ var newArr = []; for(var k = 0;k < gotArr.length;k++){ if(newArr.indexOf(gotArr[k]) === -1){ newArr.push(gotArr[k]); } } return newArr; }
-
将数组补位 我们可以这样理解,补位之前的数组长度有可能是小于10,如果小于10就进行补位,否则就不执行操作。 如果长度小于10,我们就再来一遍获取随机数,排序以及查重操作,重复这个步骤直到数组长度为10。
//补位 var reNewArr = norepeat(); function add(){ if(reNewArr.length < 10){ arr = reNewArr; for(var a = 0;;a++){ getRandomNumber(); getArr = arr; mySort(); gotArr = getArr; arr = norepeat(); if(reNewArr.length == 10){ break; } } } return arr; }
完整代码:
//获取随机数数组
var arr = [];
function getRandomNumber(){
for(var i = arr.length,num; i < 10; i++){
num = Math.floor(Math.random()*1001);
var arr2 = [num];
arr = arr.concat(arr2);
}
return arr;
}
// console.log(getArr);
//冒泡排序
var getArr = getRandomNumber();
function mySort(){
for(var x = 0;x < getArr.length;x++){
for(var y = x + 1; y < getArr.length;y++){
if(getArr[x]>getArr[y]){
var temp = getArr[x];
getArr[x] = getArr[y];
getArr[y] = temp;
}
}
}
return getArr;
}
// console.log(sort());
//去重
var gotArr = mySort();
function norepeat(){
var newArr = [];
for(var k = 0;k < gotArr.length;k++){
if(newArr.indexOf(gotArr[k]) === -1){
newArr.push(gotArr[k]);
}
}
return newArr;
}
//补位
var reNewArr = norepeat();
function add(){
if(reNewArr.length < 10){
arr = reNewArr;
for(var a = 0;;a++){
getRandomNumber();
getArr = arr;
mySort();
gotArr = getArr;
arr = norepeat();
if(reNewArr.length == 10){
break;
}
}
}
return arr;
}
document.write(add());//输出结果