Leetcode Big Manipulation 解题报告
来源:互联网 发布:erp打单软件 编辑:程序博客网 时间:2024/05/15 07:14
第一部分
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=0 for i in nums: ret=ret^i return 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=0 for i in nums: flag2 ^=(flag1 & i) flag1 ^= i flag3 =(flag2 & flag1) flag1 ^=flag3 flag2 ^=flag3 return 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=0 for i in nums: result=result^i flag=result&(~(result-1)) ans=[0,0] for i in nums: if i&flag: ans[1]=ans[1]^i else: ans[0]=ans[0]^i return 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,a elif a<0: return 2,-a else: return 0,0 def 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]=-1 flagmatrix[1][2]=1 else: flagmatrix[2][1]=1 flagmatrix[1][2]=-1 return flagmatrix[flaga][flagb],a1,b1 def 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&b a=a^b b=carry<<1 return flag*a else: tmp=~(-(abs(a)^abs(b))) flag,a,b=self.calsign(a,b) if a==b: return 0 ans=[] while(tmp): ans.append('%s'%((tmp%2)^1)) tmp=tmp/2 ans.reverse() return flag*int(''.join(ans),2)
leetcode190. Reverse Bits
简单难度
题意,32bit长的整数翻转
class Solution(object): def reverseBits(self, n): """ :type n: int :rtype: int """ ret=0 flag=0 while(flag<32): ret=(ret<<1)+(n&1) n=n>>1 flag=flag+1 return ret
注意32bit
leetcode191. Number of 1 Bits
简单难度
题意,计算整数的汉明距离
class Solution(object): def hammingWeight(self, n): """ :type n: int :rtype: int """ count=0 while(n): count=count+(n&1) n=n>>1 return 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)]+1 return 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=0 while(n): count=count+(n&1) n=n>>1 return 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=0 for j in set(i): tmp=tmp+(1<<(ord(j)-ord('a'))) ans.append(tmp) MAX_P=0 for 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=0 while(m!=n): m=m>>1 n=n>>1 count=count+1 return 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 ret for i in range(2**(len(nums))): tmp=[] state=list('{:b}'.format(i)) state=['0']*(len(nums)-len(state))+state for j in range(len(state)): if state[j]=='1': tmp.append(nums[j]) ret.append(tmp) return ret
- Leetcode Big Manipulation 解题报告
- POJ1423 Big Number解题报告
- HDU1212 Big Number 解题报告
- USACO Big Barn 解题报告
- POJ 1423 Big Number 解题报告
- pku 1423 阶乘 Big Number 解题报告
- POJ 2840 Big Clock 解题报告
- HDPJ_1171 Big Event in HDU 解题报告
- [ACM] hdoj1018 Big Number 解题报告
- LeetCode 解题报告索引
- [LeetCode]Permutations,解题报告
- Leetcode Triangle 解题报告
- [LeetCode]Anagrams,解题报告
- leetCode解题报告
- [LeetCode]Candy, 解题报告
- 【LeetCode】Candy 解题报告
- 【LeetCode】Triangle 解题报告
- 【LeetCode】Permutations 解题报告
- 【2017】数字重排
- Swift的基础之关于“!”和“?”的使用介绍
- 工程师和他媳妇儿好玩的对话3——20160704
- FastJson的基本使用
- Zabbix 图像中文乱码
- Leetcode Big Manipulation 解题报告
- bootstrap教程(一)--bootstrap简介
- Mybatis xml报错: The content of elements must consist of well-formed character data or markup
- mysql学习
- iOS音频篇:AVPlayer的缓存实现
- Office密码破解工具哪款比较好用
- (4.2.32.4)android热修复之Andfix方式:Andfix的实践应用
- 与 so 有关的一个长年大坑
- GridView如何适配不同屏幕