前言🌧️
算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。
因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。
当然,学习也是有侧重点的,作为前端我们不需要像后端开发一样对算法全盘掌握,有些比较偏、不实用的类型和解法,只要稍做了解即可。
题目🦀
剑指 Offer 56 - I. 数组中数字出现的次数
难度中等
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3] 输出:[2,10] 或 [10,2]
限制:
2 <= nums.length <= 10000
解题思路🌵
- 遍历数组进行异或,得到a^b
- 找出a和b不同的一位数字
- 根据这个不同的数字将数组去区分成2个分别含有不同数字的数组
- 最后再别分对数组进行异或得到最终不同的数字
解法🔥
/** * @param {number[]} nums * @return {number[]} */ var singleNumbers = function(nums) { //异或^ 相同位为0,不同位为1 //与& 同为1才为1 否则都为0 //1.遍历依次进行^(异或操作)获取a^b let xy=0; for(let num of nums){ xy=num^xy } //2.根据a^b获取任意一个为1的位数,代表这两个数这一位一定不同 let m=1 while((xy&m)==0){ m=m<<1 } //3.根据这不同的一位来区分出两个数组 let x=[] let y=[] for(let num of nums){ //这是一个坑,主要运算符的优先级,num&m要加括号 if((num&m)===m){ x.push(num) }else{ y.push(num) } } //4.再分别对两个数组进行循环异或得出 let resultA=0 let resultB=0 for(let num of x){ resultA=num^resultA } for(let num of y){ resultB=num^resultB } return [resultA,resultB] };
时间复杂度:O(n)
空间复杂度:O(1)
结束语🌞
那么鱼鱼的LeetCode算法篇的「LeetCode」剑指Offer-56-I数组中数字出现的次数⚡️
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。