• 整形数组合并【JS】


    问题描述

    题目链接-牛客
    将两个整型数组按照升序合并,并且过滤掉重复数组元素。
    输出时相邻两数之间没有空格。

    输入描述:

    输入说明,按下列顺序输入:

    • 输入第一个数组的个数
    • 输入第一个数组的数值
    • 输入第二个数组的个数
    • 输入第二个数组的数值

    输出描述:

    输出合并之后的数组

    示例1

    输入

    3
    1 2 5
    4
    -1 0 3 2
    
    • 1
    • 2
    • 3
    • 4

    输出

    -101235
    
    • 1

    解决的JS代码

    let arr_num = 2;
    let num;
    let ans = [];
    while (arr_num--) {
      num = readline();
      let temp = readline();
      temp = temp.split(" ");
      temp = Array.from(new Set(temp));
      temp = temp.sort();
      ans.push(temp);
    }
    
    function flat(input){
        const stack = [...input];
        const res = [];
        while(stack.length){
            const next = stack.pop();
            if(Array.isArray(next)){
                stack.push(...next);
            }else{
                res.push(next);
            }
        }
        return res.reverse();
    }
    
    ans = flat(ans);
    
    ans = Array.from(new Set(ans));
    
    ans.sort((a , b) => {
        return a - b; 
    })
    
    ans = ans.join("")
    console.log(ans);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    代码解释

    看见这个题目的第一眼就想到了JS中的数组去重Set,所以就选择使用js去写题目了

    首先这个题目其实思路很简单,就是输入后,升序,去重,然后输出

    其实,开始的时候,我都没注意到,就第一眼被数组去重吸引了,就没注意到升序还有需要输入四个数,然后还有几个js基础问题,提交了一共6次……

    需要注意的几个点

    1.readline是string

    我通过readline函数读取输入的字符,开始我想当然的以为这就是一个数组,结果处理的时候一直报错,不能使用原型链Array中的方法

    于是使用split(" ")分割字符串,变为数组

    2.无法使用flat

    处理后,变成一个二维数组,于是就像通过flat方法直接扁平化,但是牛客的js环境貌似不支持该方法,于是就手写了一个flat方法

    其实flat的源码也挺简单的

    • 通过...扩展运算符解构输入的值
    • while循环stack的长度
      • 通过pop方法拿出栈头的元素
      • 判断是否为数组
        • 是——继续push(...next)
        • 否——则记录到res数组中

    完成后,记得通过reverse函数返回原顺序的数组,因为是从后至前去遍历的,所以需要逆序一下

    
    function flat(input){
        const stack = [...input];
        const res = [];
        while(stack.length){
            const next = stack.pop();
            if(Array.isArray(next)){
                stack.push(...next);
            }else{
                res.push(next);
            }
        }
        return res.reverse();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.数组去重

    直接通过Array.from(new Set(数组))即可完成数组区中,借用Set的数据结构完成

    4.sort函数的排序方式

    sort函数的是通过ASCII码去排序的,所以会出现这样的情况
    原数组为2,3,6,8,11
    结果却为
    11 2 3 6 8
    请添加图片描述

    因为1的ASCII码更小,所以被放在了第一位,所以需要重写

    ans.sort((a , b) => {
        return a - b; 
    })
    
    • 1
    • 2
    • 3

    若需要降序,将a,b两者反过来即可

    5.数组转字符串——join

    最后题目结果需要输出的是不带空格的输出格式,所以需要将数组转换为字符串

    直接通过join函数转换即可

    ans = ans.join("")
    
    • 1
  • 相关阅读:
    硬件新问答
    php 上传文件报错The file failed to upload
    iterator的用法 | reverse_iterator的封装实现
    阿里云CPaaS,上榜Gartner全球代表服务商
    Linux真的很难吗?文末送5本《Linux运维之道(第3版)》
    大彩串口屏读写文件问题
    C++学习——位操作
    JavaScript入门
    SSM+好乐买超市管理系统 毕业设计-附源码111743
    并查集及相关变形
  • 原文地址:https://blog.csdn.net/qq_22841387/article/details/125558667