挥剑 Offer II 00

lxf2023-03-22 08:30:02

序言

  • 如今前面规定变变高,找工作时可能遇上算法题,每日刷几个算法题做好充足的准备,今天《剑指 Offer(专项突击版)》第3|4题。

挥剑 Offer II 003. 前 n 个数据二进制中 1 的数量

给出一个非负整数 n ,请测算 0 到 n 中间的每一个数的二进制表示中 1 的数量,并导出一个二维数组。

难度系数:简易

实例 1:
键入: n = 2 导出: [0,1,1] 表述:  0 --> 0 1 --> 1 2 --> 10 
实例 2:
键入: n = 5 导出: [0,1,1,2,1,2] 表述: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101 

表明 :
● 0 <= n <= 105

知识要点: 位运算 动态规划算法

方法一:位运算

剖析:

形象化打法,使用一个for循环进行计算从0到n的每一个整数金额i的二进制方式中1的数量。

每次用“i&(i-1)”将整数金额i的右面的1变为0。整数金额i减掉1,那它右面的1变为0。假如它右侧也有0,则右侧每一个0都变成了1,并且左侧全部位都保持一致。

/**
 * @param {number} n
 * @return {number[]}
 */
var countBits = function(n) {
    let result = new Array(n   1).fill(0);;
    for (let i = 0; i<=n; i  ) {
        let j = i;
        while(j !== 0) {
            result[i]  ;
            j = j & (j -1);
        }
    }
    return result;
};

复杂度分析

  • 算法复杂度:O(nlogn)。必须对从 0 到 n 的每一个整数金额应用测算「一比特数」,对于每一个整数计算「一比特数」时间都不能超过 O(logn)。
  • 空间复杂度:O(1)。除开返回二维数组之外,空间复杂度为常量。

方法二:动态规划算法

剖析:

依据前面的剖析得知,“i&(i-1)”将i的二进制方式中右面的1变为0,换句话说,整数金额i的二进制方式中1的数量比“i&(i-1)”的二进制方式中1的数量多1。

/**
 * @param {number} n
 * @return {number[]}
 */
var countBits = function(n) {
    let res = [];
    res[0] = 0
    for(let i = 1;i <=n;i  ) {
        //整数金额 i 的二进制方式中1的数量比 i &(i - 1)的二进制方式中1的数量多1
        res[i] = res[i & (i - 1)]   1;
    }
    return res
};

复杂度分析

  • 算法复杂度:O(n)。对于每一个整数金额,只需 O(1) 的时间换算「一比特数」。

  • 空间复杂度:O(1)。除开返回二维数组之外,空间复杂度为常量。

挥剑 Offer II 004. 只发生一次的数据

给你一个整数金额二维数组 nums ,除某一原素仅发生 一次 外,其他每一个要素都恰发生 三次 。 麻烦你找到并回到这个只出现一次元素。

难度系数:中等水平

实例 1:
键入:nums = [2,2,3,2] 导出:3 
实例 2:
键入:nums = [0,1,0,1,0,1,100] 导出:100 

提醒:
● 1 <= nums.length <= 3 * 104
● -231 <= nums[i] <= 231 - 1
● nums 中,除某一原素仅发生 一次 外,其他每一个要素都恰发生 三次

知识要点: 位运算 二维数组

方法一:位运算

剖析:

针对统计数据重复次数,能够想起Hash表,但这样未使用每一个要素都恰发生 三次 特点。或使用排列然后再进行统计的算法复杂度可能高过O(n)。但是若面试的时候没有头绪,可以直接答转让招聘者正确引导再次回应。

这个题目有一个简易版的相近的题“输入数组中除了一个数字只发生一次以外别的数据都出现了2次,请找到只发生一次的数据”。任何一个数据异或运算它本身的结果还是0。如果把二维数组中所有数字开展异或运算,那样最后的结果就是这个只发生一次的数据。

考虑到数的二进制方式。将字符串中所有数字的同一区域的多位求和。

如果把发生3次数据独立取出来,那这些出现3次数的随意第i个多位总和都可以被3能整除。因而,假如二维数组中所有数字第i个多位求和总和会被3能整除,那样只发生一次的数据第i个多位一定是0;假如二维数组中所有数字第i个多位求和之与被3除余1,那样只发生一次的数据第i个多位一定是1。

统计分析所有数字各二进制位中 1 的重复次数,并且对 3 求余,结论乃为只发生一次的数据。

挥剑 Offer II 00

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    // 创建一个长度为32的二维数组,初始值为0
    let arr = new Array(32).fill(0);
    for (let i = 0; i<nums.length; i  ) {
        for (let j = 0; j<32; j  ) {
            // 整数金额i先被偏移31-i位,原先从右起第i个多位偏移以后坐落于右面
            // 与1做位与运算   换句话说仅有1与1做位与运算才为1不然为0
            arr[j]  = (nums[i] >> (31 - j)) & 1;
        }
    }

    // arr中每一位保留着nums中相匹配位中1的数目和
    let res = 0;
    for (let i = 0; i<32; i  ) {
        res = (res << 1)   (arr[i] %3);
    }
    return res;
};

复杂度分析

  • 算法复杂度:O(n)
  • 空间复杂度:O(1)

so

  • 末尾依然:长风破浪会有时,直挂云帆济沧海!
  • 线上搜集的确实很好,对AdminJS的帖子进行了一个归纳梳理,在线刷题手册,拿走不谢,要会站在他人的肩上提高自己点击这里--> 前面升阶手册

挥剑 Offer II 00

传送器

  • 个人简历外包装 || 简历造假 vs 背调
  • 卷王的2021汇总
  • 我为什么会喜欢抄写编码
  • 前面三年:新手变为老油子
  • 在今年的面试了100 的前面同学们我的总结
  • 我为什么坚持六点起床
  • 读了技术书特别焦虑,读不下去了书该怎么办?
  • 奋发努力 === "卷" ?
  • vite react ts 手去摸手做新项目系列一 (项目配置篇)
  • vite react ts 手去摸手做新项目系列产品二 (实战篇)