当前位置: 首页 > news >正文

西藏建设厅官方网站web个人网站设计代码

西藏建设厅官方网站,web个人网站设计代码,传智播客黑马程序员,ui设计好就业吗我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~ 前菜 开始之前我们先了解下…

我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~

前菜

开始之前我们先了解下异或,后面会用到。

异或的性质
两个数字异或的结果a^b是将 a 和 b 的二进制每一位进行运算,得出的数字。 运算的逻辑是果同一位的数字相同则为 0,不同则为 1。

异或的规律:

  • 任何数和本身异或则为0
  • 任何数和 0 异或是本身
  • 异或运算满足交换律,即:a ^ b ^ c = a ^ c ^ b

OK,我们来看下这三道题吧。

136. 只出现一次的数字 1

题目大意是除了一个数字出现一次,其他都出现了两次,让我们找到出现一次的数。我们执行一次全员异或即可

class Solution:def singleNumber(self, nums: List[int]) -> int:single_number = 0for num in nums:single_number ^= numreturn single_number

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

137. 只出现一次的数字 2

题目大意是除了一个数字出现一次,其他都出现了三次,让我们找到出现一次的数。 灵活运用位运算是本题的关键。

Python3:

class Solution:def singleNumber(self, nums: List[int]) -> int:res = 0for i in range(32):cnt = 0  # 记录当前 bit 有多少个1**加粗样式**           bit = 1 << i  # 记录当前要操作的 bitfor num in nums:if num & bit != 0:cnt += 1if cnt % 3 != 0:# 不等于0说明唯一出现的数字在这个 bit 上是1res |= bitreturn res - 2 ** 32 if res > 2 ** 31 - 1 else res
  • 为什么 Python 最后需要对返回值进行判断?

如果不这么做的话测试用例是[-2,-2,1,1,-3,1,-3,-3,-4,-2] 的时候,就会输出 4294967292。 其原因在于 Python 是动态类型语言,在这种情况下其会将符号位置的 1 看成了值,而不是当作符号“负数”。 这是不对的。 正确答案应该是 - 4,-4 的二进制码是 1111…100,就变成 2^32-4=4294967292,解决办法就是 减去 2 ** 32 。

之所以这样不会有问题的原因还在于题目限定的数组范围不会超过 2 ** 32

JavaScript:

var singleNumber = function (nums) {let res = 0;for (let i = 0; i < 32; i++) {let cnt = 0;let bit = 1 << i;for (let j = 0; j < nums.length; j++) {if (nums[j] & bit) cnt++;}if (cnt % 3 != 0) res = res | bit;}return res;
};

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

上述感觉这种方法他没说清楚,特此补充完整,

方法二:依次确定每一个二进制位

思路与算法

在这里插入图片描述

细节

在这里插入图片描述

代码

class Solution {public int singleNumber(int[] nums) {int ans = 0;for (int i = 0; i < 32; ++i) {int total = 0;for (int num: nums) {total += ((num >> i) & 1);}if (total % 3 != 0) {ans |= (1 << i);}}return ans;}
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/single-number-ii/solution/zhi-chu-xian-yi-ci-de-shu-zi-ii-by-leetc-23t6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

645. 错误的集合

和上面的137. 只出现一次的数字2思路一样。这题没有限制空间复杂度,因此直接 hashmap 存储一下没问题。 不多说了,我们来看一种空间复杂度 O ( 1 ) O(1) O(1)的解法。

由于和137. 只出现一次的数字2思路基本一样,我直接复用了代码。具体思路是,将 nums 的所有索引提取出一个数组 idx,那么由 idx 和 nums 组成的数组构成 singleNumbers 的输入,其输出是唯二不同的两个数。

但是我们不知道哪个是缺失的,哪个是重复的,因此我们需要重新进行一次遍历,判断出哪个是缺失的,哪个是重复的。

class Solution:def singleNumbers(self, nums: List[int]) -> List[int]:ret = 0  # 所有数字异或的结果a = 0b = 0for n in nums:ret ^= n# 找到第一位不是0的h = 1while(ret & h == 0):h <<= 1for n in nums:# 根据该位是否为0将其分为两组if (h & n == 0):a ^= nelse:b ^= nreturn [a, b]def findErrorNums(self, nums: List[int]) -> List[int]:nums = [0] + numsidx = []for i in range(len(nums)):idx.append(i)a, b = self.singleNumbers(nums + idx)for num in nums:if a == num:return [a, b]return [b, a]

复杂度分析
时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( 1 ) O(1) O(1)

260. 只出现一次的数字 3

题目大意是除了两个数字出现一次,其他都出现了两次,让我们找到这个两个数。

我们进行一次全员异或操作,得到的结果就是那两个只出现一次的不同的数字的异或结果。

我们刚才讲了异或的规律中有一个任何数和本身异或则为0, 因此我们的思路是能不能将这两个不同的数字分成两组 A 和 B。 分组需要满足两个条件.

  • 两个独特的的数字分成不同组
  • 相同的数字分成相同组

这样每一组的数据进行异或即可得到那两个数字。

问题的关键点是我们怎么进行分组呢?

由于异或的性质是,同一位相同则为 0,不同则为 1. 我们将所有数字异或的结果一定不是 0,也就是说至少有一位是 1.

我们随便取一个, 分组的依据就来了, 就是你取的那一位是 0 分成 1 组,那一位是 1 的分成一组。 这样肯定能保证2. 相同的数字分成相同组, 不同的数字会被分成不同组么。 很明显当然可以, 因此我们选择是 1,也就是 说两个独特的的数字在那一位一定是不同的,因此两个独特元素一定会被分成不同组。

class Solution:def singleNumbers(self, nums: List[int]) -> List[int]:ret = 0  # 所有数字异或的结果a = 0b = 0for n in nums:ret ^= n# 找到第一位不是0的h = 1while(ret & h == 0):h <<= 1for n in nums:# 根据该位是否为0将其分为两组if (h & n == 0):a ^= nelse:b ^= nreturn [a, b]

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

在这里插入图片描述

方法二:位运算

思路与算法

在这里插入图片描述
在这里插入图片描述

代码

class Solution {public int[] singleNumber(int[] nums) {int xorsum = 0;for (int num : nums) {xorsum ^= num;}// 防止溢出int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));int type1 = 0, type2 = 0;for (int num : nums) {if ((num & lsb) != 0) {type1 ^= num;} else {type2 ^= num;}}return new int[]{type1, type2};}
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/single-number-iii/solution/zhi-chu-xian-yi-ci-de-shu-zi-iii-by-leet-4i8e/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
http://www.shuangfujiaoyu.com/news/37189.html

相关文章:

  • 长沙餐饮设计公司持续优化疫情防控举措
  • dreamweaver做网站教程整站排名服务
  • 网站域名申请百度经验官网首页
  • 手机做任务网站有哪些谷歌优化技巧
  • app定制开发网站有哪些成都网站seo排名优化
  • 河南专业建网站如何投放网络广告
  • 周杰伦做的广告网站搜索引擎最新排名
  • 哪些网站做批发衣服市场营销策划书
  • 深圳找个人做网站关键词优化seo费用
  • 苏州企业建站程序小红书推广怎么收费
  • 苏州前十名传媒公司单页站好做seo吗
  • 网站后台html编辑器搜索引擎优化seo名词解释
  • 网站建设与会展央视网新闻
  • 长清网站建设电话seo网站优化推荐
  • 做网站需要apache火蝠电商代运营靠谱吗
  • 可视化建站工具商业软文
  • 如何查询网站开发南宁seo排名收费
  • wordpress 修改登录页面seo搜索引擎优化是
  • 长春建站模板评测seo网站优化案例
  • 盐城网站建设要多少钱营销必备十大软件
  • 网站建设托管金融网站推广圳seo公司
  • 青岛 生物类网站建设河南网站优化
  • 提升学历报名入口seo优化课程
  • 做网站不能有中文字符营销模式有几种
  • 佛山网站seo优化排名公司企业网站的在线推广方法有
  • 哪些网站是单页面应用程序打开百度官网
  • 学生做网站的软件百度关键词搜索量统计
  • 摄影协会网站源码线上营销渠道主要有哪些
  • 网站域名记录值株洲seo优化首选
  • 精仿源码社区网站源码枸橼酸西地那非片功效效及作用