• LeetCode 283 移动零


    283. 移动零

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

    示例:

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

    说明:

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

    解法1

    思路: 使用 变量 j 来标记0所在的位置,使用 **变量i **来遍历整个数组,当 i所在的位置 不为零的时候,把 j 所在的位置赋值为 nums[j], 然后把nums[i]的值设为0,此时j位置的值已经正确,然后把j的值自增

    结果: 使用js的时候,涉及到类型转换.当我用 != 的时候, 执行用时 :56 ms, 在所有 JavaScript 提交中击败了99.89%的用户.当我用 !== 的时候, 才打败了14.5%的用户……这是为啥呢??? (后来原因找到了,不是类型转换的锅,多执行两次就好了,以后还是应该用===)

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

    解法2

    思路: 设遍历整个数组,每遇到一个0,遍把这个0从数组中删掉,然后在数组的最后面插入一个0

    结果: 由于多次使用splice()方法,splice()方法本质上还是把数组全部往前挪了一遍,导致程序性能稍微差一点…不过属于还可以接受那种

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

    接下来看LeetCode上面的高票答案...

    解法3

    看了半天的LeetCode答案 大部分的思路都跟第一种类似

    然后我在LeetCode中国区翻啊翻啊翻 牛逼的来了

    思路:

    • 遍历数组,不为0的元素移动数组前方,用index下标记录.
    • 遍历结束,对index值后的元素统一设为0

    (这里用JAVA的写法特别特别的快)

    var moveZeroes = function(nums) {
        let index = 0;
      //	注意 这里不能用in  而是要用of
        for(let num of nums) {
              if(num!=0){
                  nums[index++]=num;
              }
        }
        while(index < nums.length) {
            nums[index++] = 0;
        }
    };
    
  • 相关阅读:
    redis主从模式
    深入理解BigDecimal
    double使用BigDecimal进行计算出现精确度问题
    代理IP爬取和验证(快代理&西刺代理)
    Jsoup-简单爬取知乎推荐页面(附:get_agent())
    Jsoup-基础练习
    取数据超过内存限制的问题-解决方案(sample,takeSample,filter)
    说出你的故事:你为什么学爬虫
    hadoop第一次面到hr(品友互动)
    MapReduce本地运行模式wordcount实例(附:MapReduce原理简析)
  • 原文地址:https://www.cnblogs.com/ssaylo/p/12682845.html
Copyright © 2020-2023  润新知