Leetcode Big Manipulation 解题报告

2024-04-10 23:18

本文主要是介绍Leetcode Big Manipulation 解题报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一部分

leetcode136. Single Number

中等难度

题意,给一个整数数组,数组中除了一个元素只有一个,其余元素都有两个,求这个只出现一次的元素。

要求时间复杂度为O(n),空间复杂度为O(1)

思路:利用异或来解决问题,a^a=0,0^b=b

解答:

 class Solution(object):def singleNumber(self, nums):""":type nums: List[int]:rtype: int"""ret=0for i in nums:ret=ret^ireturn ret 

leetcode137. Single Number II

中等难度

题意,给一个整数数组,数组中除了一个元素只出现一次,其余元素都出现三次,求这个只出现一次的元素

要求时间复杂度为O(n),空间复杂度为O(1)

思路:用flag_i来标记当前出现i次的元素,规则如下:

  • 先更新flag2,flag2=flag2^(flag1&i)
  • 再更新flag1, flag1=flag1^i
  • 计算flag3, flag3=flag2&flag1
  • 计算flag1=flag1^flag3
  • 计算flag2=flag2^flag3(因为到达flag3的元素,必然在flag1,flag2中出现,因此要把它们剔除)
class Solution(object):def singleNumber(self, nums):""":type nums: List[int]:rtype: int"""flag1=0;flag2=0;flag3=0for i in nums:flag2 ^=(flag1 & i)flag1 ^= iflag3 =(flag2 & flag1)flag1 ^=flag3flag2 ^=flag3return flag1

leetcode260. Single Number III

中等难度

题意,给一个整数数组,数组中除了两个元素只出现一次,其余元素都出现两次,求这个只出现一次的两个元素

*思路:*a^a=0,0^b=1,因为这两个元素不是同一个值,则x^y!=0,必有一位为1->flag,将数组拆分成两部分,i&flag=0 和 i&flag=1,然后各自求异或

class Solution(object):def singleNumber(self, nums):""":type nums: List[int]:rtype: List[int]"""result=0for i in nums:result=result^iflag=result&(~(result-1))ans=[0,0]for i in nums:if i&flag:ans[1]=ans[1]^ielse:ans[0]=ans[0]^ireturn ans

第二部分

leetcode371. Sum of Two Integers

简单难度

题意,不能用+、-符号,计算两个数字的和

思路:

二进制计算为:

0 + 0= 0

0 + 1= 1

1 + 0= 1

1 + 1= 0

即异或操作(^)

进位表示为:

010

011

——

(010&011)<<1=010<<1=100

public class Solution {  public int getSum(int a, int b) {  int unit = a ^ b;  int carry_bit = a & b;  while(carry_bit != 0) {  int temp_a = unit;  int temp_b = carry_bit << 1;  unit = temp_a ^ temp_b;  carry_bit = temp_a & temp_b;  }  return unit;  }  
}  

python因为有个时间限制,所以又弄了一个版本

class Solution(object):def signfunc(self,a):if a>0:return 1,aelif a<0:return 2,-aelse:return 0,0def calsign(self, a, b):flagmatrix=[[0,1,-1],[1,1,0],[-1,0,-1]]flaga,a1=self.signfunc(a)flagb,b1=self.signfunc(b)if a1>b1:flagmatrix[2][1]=-1flagmatrix[1][2]=1else:flagmatrix[2][1]=1flagmatrix[1][2]=-1return flagmatrix[flaga][flagb],a1,b1def getSum(self, a, b):""":type a: int:type b: int:rtype: int"""if a*b>=0:flag,a,b=self.calsign(a,b)while(b):carry=a&ba=a^bb=carry<<1return flag*aelse:tmp=~(-(abs(a)^abs(b)))flag,a,b=self.calsign(a,b)if a==b:return 0ans=[]while(tmp):ans.append('%s'%((tmp%2)^1))tmp=tmp/2ans.reverse()return flag*int(''.join(ans),2)

leetcode190. Reverse Bits

简单难度

题意,32bit长的整数翻转

class Solution(object):def reverseBits(self, n):""":type n: int:rtype: int"""ret=0flag=0while(flag<32): ret=(ret<<1)+(n&1)n=n>>1flag=flag+1return ret

注意32bit

leetcode191. Number of 1 Bits

简单难度

题意,计算整数的汉明距离

class Solution(object):def hammingWeight(self, n):""":type n: int:rtype: int"""count=0while(n):count=count+(n&1)n=n>>1return count

leetcode338. Counting Bits

中等难度

题意,计算从0到num的每一个元素的汉明距离

class Solution(object):def countBits(self, num):""":type num: int:rtype: List[int]"""ret=[0 for i in range(num+1)]for i in range(1,num+1):ret[i]=ret[i&(i-1)]+1return ret

leetcode231. Power of Two

简单难度,判断数字是否是2的幂
思路: 判断汉明距离是否为1

class Solution(object):def isPowerOfTwo(self, n):""":type n: int:rtype: bool"""return (n!=0 and n&(n-1)==0)

或者

class Solution(object):def isPowerOfTwo(self, n):""":type n: int:rtype: bool"""count=0while(n):count=count+(n&1)n=n>>1return count==1

leetcode342. Power of Four

简单难度,判断数字是否是4的幂
思路: 判断汉明距离是否为1,且1是否在奇数位上

class Solution(object):def isPowerOfFour(self, num):""":type num: int:rtype: bool"""return num>0 and (num &(num-1))==0 and (num & 0x55555555) == num

leetcode318. Maximum Product of Word Lengths

中等难度
给定单词数组,返回不相交的两个单词的长度之积的最大值
思路:将单词进行编码
‘a’->0
‘b’ ->10
x&y==0说明x和y不相交

class Solution(object):def maxProduct(self, words):""":type words: List[str]:rtype: int"""ans=[]for i in words:tmp=0for j in set(i):tmp=tmp+(1<<(ord(j)-ord('a')))ans.append(tmp)MAX_P=0for i in range(len(words)):for j in range(i,len(words)):if ans[i] & ans[j]==0:MAX_P=max(MAX_P,len(words[i])*len(words[j]))return int(MAX_P)

leetcode201. Bitwise AND of Numbers Range

中等难度
计算[m,n]中每个整数相与的结果

class Solution(object):def rangeBitwiseAnd(self, m, n):""":type m: int:type n: int:rtype: int"""count=0while(m!=n):m=m>>1n=n>>1count=count+1return m<<count

leetcode78. Subsets

中等难度
给定一个集合,求子集
思路: 状态压缩法

class Solution(object):def subsets(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""ret=[]if not len(nums):return retfor i in range(2**(len(nums))):tmp=[]state=list('{:b}'.format(i))state=['0']*(len(nums)-len(state))+statefor j in range(len(state)):if state[j]=='1':tmp.append(nums[j])ret.append(tmp)return ret

这篇关于Leetcode Big Manipulation 解题报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892426

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目