zoukankan      html  css  js  c++  java
  • 算法面试题三:两个数组的交集,加一,移动零

    这里介绍两个数组的交集,加一及移动零的个人解决方法

    题目一:两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集。

    示例 1:

    输入:nums1 = [1,2,2,1], nums2 = [2,2]
    输出:[2,2]

    示例 2:

    输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出:[4,9]

    说明:

    输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
    我们可以不考虑输出结果的顺序。  

    进阶:

    如果给定的数组已经排好序呢?你将如何优化你的算法?
    如果 nums1 的大小比 nums2 小很多,哪种方法更优?
    如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

    答案:

    /**
     * @param {number[]} nums1
     * @param {number[]} nums2
     * @return {number[]}
     */
    var intersect = function(nums1, nums2) {
        var arr = [];
        for(let i = 0;i<nums1.length;i++){
            let bind = true;
            for(let j = 0;j<nums2.length;j++){
                if(nums1[i] == nums2[j] && bind == true){
                    arr.push(nums1[i]);
                    nums2.splice(j,1);
                    j--;
                    bind = false;
                    break;
                }
            }
        }
        return arr;
    };

    题目二:加一

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
    
    最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
    
    你可以假设除了整数 0 之外,这个整数不会以零开头。

    示例 1:

    输入:digits = [1,2,3]
    输出:[1,2,4]
    解释:输入数组表示数字 123。

    示例 2:

    输入:digits = [4,3,2,1]
    输出:[4,3,2,2]
    解释:输入数组表示数字 4321。

    示例 3:

    输入:digits = [0]
    输出:[1]

    答案:

    /**
     * @param {number[]} digits
     * @return {number[]}
     */
    var plusOne = function(digits) {
        let length = digits.length - 1;
        let bind = true;
        for(let i=digits.length-1;i>=0;i--){
            if(bind == true && digits[i] < 9){
                bind = false;
                digits[i] = digits[i]+1;
            }else if(digits[i] == 9 && bind == true){
                digits[i] = 0;
            }
        }
        if(bind == true){
            digits.unshift(1);
        }
        return digits;
    };

    题目三:移动零

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    示例:

    输入: [0,1,0,3,12]
    输出: [1,3,12,0,0]

    说明:

    必须在原数组上操作,不能拷贝额外的数组。
    尽量减少操作次数。

    答案:

    /**
     * @param {number[]} nums
     * @return {void} Do not return anything, modify nums in-place instead.
     */
    var moveZeroes = function(nums) {
        let num = 0;
        for(let i=0;i<nums.length;i++){
            if(nums[i] == 0){
                nums.splice(i,1);
                num++;
                i--;
            }
        }
        if(num != 0){
            for(let j =0;j<num;j++){
                nums.push(0);
            }
        }
        
    };

    如果对你有帮助,请你点个推荐,我会和你一起进步,加油(*^▽^*)。

  • 相关阅读:
    c++ 函数中的部分代码执行一次
    如何限制对象只能建立在堆上或者栈上
    FFMPEG Qt视频播放器
    C/C++中带可变参数的函数
    柔性数组
    压缩图片网站
    vscode存盘时格式化
    两个i标签之间有缝隙
    node 中process进程argv,argv0,execArgv,execPath
    chalk插件 使终端输出的字带颜色
  • 原文地址:https://www.cnblogs.com/smileZAZ/p/14358025.html
Copyright © 2011-2022 走看看