JavaScript的数组练习

  • Post author:
  • Post category:java
1. 读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.
   提示:把10门课的成绩保存如一个数组中.
2. 创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数
3. 定义一个函数, 判断数组中是否所有的数字都大于0
    提示: 传入一个数组, 返回布尔值
4. 封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组
    提示: 传入两个数组, 返回值为新的数组
5. 定义一个函数: 可以把数组中的下标为 3 的元素移到数组的开头.
    提示: 传入一个数组
6. 有一个从大到小排好序的数组{99,85,82,63,60}。
    现从页面输入一个数,要求按原来的规律将它插入数组中。
    假设你输入的80,则应该插入到82和63之间。
7. 一个数字中有20个元素,对前10个元素使用升序,后10个元素使用降序。
    元素都是整数。

1.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<!--题目:读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.
    提示:把10门课的成绩保存如一个数组中.-->
<body>
<script>
    var sum = 0;
    var ave = 0;
    var arr = [90, 100, 10, 20, 30, 40, 50, 60, 70, 80];
    console.log(arr);
    //排序
    arr.sort(function (a, b) {
        return a - b;
    });

    //最高分
    function large(arr) {
        return arr[arr.length - 1];
    };

    //最低分
    function small(arr) {
        return arr[0];
    };

    //总分
    function total(arr) {
        for (var ele of arr) {
            sum += ele;
        }
        return sum;
    };

    //平均分
    function ave(arr) {
        return sum / arr.length;
    }

    //输出
    console.log("总分: " + total(arr));
    console.log("最高分: " + large(arr));
    console.log("最低分: " + small(arr));
    console.log("平均分: " + ave(arr));

</script>
</body>
</html>
<!--记得再次用原型替换3进行调试-->

用函数封装起来:(更具面向对象的思想)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function Student(){
    this.scores = [];
    this.init = function (){
        for (var i = 0; i < 3; i++){
            var score = +prompt("请输入学生的成绩:");
            this.scores.push(score);
        }
    };
    this.max = function (){
        var scores = this.scores;
        var m = scores[0];// ["100", "200", "40"]
        for(var i = 1; i < scores.length; i++){
            if(m < scores[i]){
                m = scores[i];
            }
        }
        return m;
    }
    this.min = function (){
        var scores = this.scores;
        var m = scores[0];// ["100", "200", "40"]
        for(var i = 1; i < scores.length; i++){
            if(m > scores[i]){
                m = scores[i];
            }
        }
        return m;
    }
    this.sum = function (){
        var s = 0;
        for(var e of this.scores){
            s += e;
        }
        return s;
    }
    this.avg = function (){
        return this.sum() / this.scores.length;
    }
}

var s1 = new Student();
s1.init(); //初始化学生的成绩

console.log(s1.max());
</script>
</body>
</html>

2.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数-->

<script>
    //arr是放随机数产生的数字,newArr是放重复元素和重复个数的二维数组
    var arr = [];
    var newArr = [];

    //js的数组可以动态增加,使用数组字面量创建
    for (var i = 0; i < 100; i++) {
        //用random判断随机数其实不是perfect(正态分布)
        arr[i] = parseInt(Math.random() * 50 + 10);
    }
    console.log("随机数(正态分布):\n" + arr);

    //对数组进行排序
    arr.sort(function (a, b) {
        return a - b;  //升序
    });
    console.log("随机升序排序:\n" + arr);

    //判断数组元素的重复个数,这样算法是相对而言比较高效的,省掉了低效的代码率
    for (var i = 0; i < arr.length;) {
        var count = 0;
        for (var j = i; j < arr.length; j++) {
            if (arr[i] == arr[j]) {
                count++;
            } else {
                break;
            }
        }
        newArr.push([arr[i], count]);
        i += count;
    }
    //输出二维数组
    for (var i = 0; i < newArr.length; i++) {
        console.log(newArr[i][0] + "重复次数:" + newArr[i][1]);
    }
</script>
<body>
</body>
</html>

在这顺便讲解一下随机数生成的方法,以后只要涉及到随机数,就套路进去就行,就跟数学公式一样。(证明略)

如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备。

方法1:Math.random() 函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1)

生成n-m,包含n但不包含m的整数:

Step1:算出 m-n的值,假设等于w

Step2:Math.random()*w

Step3:Math.random()*w+n

Step4:parseInt(Math.random()*w+n, 10)  在这里10表示10进制,默认就是10进制。

方法2:生成n-m,不包含n但包含m的整数:​

Step1:算出 m-n的值,假设等于w

Step2:Math.random()*w

Step3:Math.random()*w+n

Step4:Math.floor(Math.random()*w+n) + 1    

注:Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入

一般记住这两种方法就行了。

另解:(在那里要不要加1,看自己的情况,掌握怎么算的):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//  [0, 1)  [0, 51)   [10, 61)   [10, 60]
// m = 10 n= 60
function randomInt(m, n){  //区间: [m, n]
    return parseInt(Math.random() * (n - m + 1) + m);
}

/*创建一个长度是 count, 元素的值的范围 是 [m, n]的数组*/
function createArray(count, m, n){
    var arr = [];
    for (var i = 0; i < count; i++){
        arr.push(randomInt(m, n));
    }
    return arr;
}

function tongji(){
    var obj = {};
    var arr = createArray(400, 10, 19);
    for (var num = 10; num <= 19; num++){
        var c = 0;
        for (var e of arr){
            if (e == num){
                c++;
            }
        }
        obj[num + ""] = c;
    }
    return obj;
    
}
var result = tongji();
console.log(10 + "的个数:" + result["10"]);
console.log(result["11"]);
console.log(result);

</script>
</body>
</html>

3.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--定义一个函数, 判断数组中是否所有的数字都大于0
    提示: 传入一个数组, 返回布尔值
-->
<body>
<script>
    var arr=[10,20,3,1,3.1,9,1,34,90,0,-100,100];
    var flag=true;
    for(var i=0;i<arr.length;i++){
        if(arr[i]<0){
            flag=false;
            console.log("数组存在第一个非正值为:"+arr[i]+" 其数组下标为 "+i);
            break;
        }
    }
    if(flag){
        console.log("数组恒正~");
    }else{
        console.log("因此,数组不是恒正的~");
    }
</script>
</body>
</html>

4.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组
    提示: 传入两个数组, 返回值为新的数组
-->
<body>
<script>
    var arr1 = [1, 2, 3, "aaa", "hello", 999, -1];
    var arr2 = [3, 78, "aaa", "bbb", 99, 1, -1, "hello"];
    var newArr = [];

    //两层嵌套,效率很低。
    function common(arr1, arr2) {
        for (var i = 0; i < arr1.length; i++) {
            for (var j = 0; j < arr2.length; j++) {
                if (arr1[i] === arr2[j]) {
                    newArr.push(arr1[i]);
                }
            }
        }
    }

    common(arr1, arr2);
    console.log(newArr);
</script>
</body>
</html>

5.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--定义一个函数: 可以把数组中的下标为 3 的元素移到数组的开头.
    提示: 传入一个数组
-->
<script>
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 111];
    console.log("原数组: " + arr);
    //函数alter将下标为3的移动到开头
    function alter(arr) {
        var temp = arr[3];
        arr.splice(3, 1);
        arr.splice(0, 0, temp);
    }

    alter(arr);
    console.log("移动后数组: " + arr);
</script>
</body>
</html>

6.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--题目:有一个从大到小排好序的数组{99,85,82,63,60}。
    现从页面输入一个数,要求按原来的规律将它插入数组中。
    假设你输入的80,则应该插入到82和63之间。
-->
<!--
此题方法集锦:
法1:投机取巧   直接先把数字插入到数组头部或者尾部,然后一块排序,很ok吧。

法2:用折半查找二分法,在大样本数据下比较高效,本题解法实则时间复杂度达到O(n),而折半O(log2n)

-->
<body>
<script>
    //需插入的数字
    var insertNum=16;

    //假设未排序,自己先排序一下
    var arr=[88,98,2,5,8,10,25,36];
    arr.sort(function (a,b) {
        return b-a;    //降序排列
    });
    console.log("降序排列的数组为:"+arr);

    // 此循环得到的i值就是排序好的数组最接近insertNum值得那个最大下标,虽然效率很差。
    for(var i=0;i<arr.length;i++){
        if(arr[i]>=insertNum){
            var temp=i;
        }
    }

    //插入到下标为temp+1的位置
    arr.splice(temp+1,0,insertNum);

    //输出info
    console.log("插入数字"+insertNum+"后的新数组为: "+arr);


</script>
</body>
</html>

另解:

<script>
/*7. 有一个从大到小排好序的数组{99,85,82,63,60}。
    现从页面输入一个数,要求按原来的规律将它插入数组中。
    假设你输入的80,则应该插入到82和63之间。*/
function insert(arr, num){
    for(var i = 0; i < arr.length; i++){
        if(arr[i] < num){
            arr.splice(i, 0, num);
            return;   // 直接结束函数
        }
    }
    arr.push(num);
}
var arr = [99, 85, 82, 63, 60];
insert(arr, 610);
console.log(arr);
</script>

7.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    //数组元素20个
    var arr = [100,12,34,67,23,16,6,9,24,79,2,90,33,69,1,34,-2,0,666,1000];

    //切片
    var arr1=arr.slice(0,10);
    var arr2=arr.slice(10);

    //前升序
    arr1.sort(function (a,b) {
        return a-b;
    });

    //后降序
    arr2.sort(function (a,b) {
        return b-a;
    });

    //组合新数组(cs6)并输出
    var newArr = [...arr1,...arr2];
    console.log("前升序后降序的数组为: " + newArr);
</script>
</body>
</html>


版权声明:本文为LY_code原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。