力扣刷题之位运算
迪恩_Emma
喜欢看书的Java开发
展开
-
338. 比特位计数(简单)
思路: 位运算,分偶数和奇数2种情况 代码: class Solution { public int[] countBits(int num) { int[] dp=new int[num+1]; dp[0]=0; for(int i=1;i<=num;i++){ if(i%2==1){ //奇数,前一个数的结果+1 dp[i]=dp[i-1]+1; } else{ //偶数,与前一个偶数相同 dp[i]=dp[.原创 2021-06-13 09:16:50 · 140 阅读 · 0 评论 -
287. 寻找重复数(中等)
思路: 题目要求不能修改数组nums,也就是不能原地修改 并且要求空间复杂度为O(1),表明不能使用哈希表 则此题利于位运算或floy算法 代码: class Solution { public int findDuplicate(int[] nums) { int f=0,s=0; //第一次循环找到相遇点 while(true){ f=nums[nums[f]]; s=nums[s]; if(f==s){ break; } } .原创 2021-06-11 10:26:41 · 209 阅读 · 2 评论 -
136. 只出现一次的数字(简单)
思路: 位运算 代码: class Solution { public int singleNumber(int[] nums) { int res=0; for(int num:nums){ res^=num; } return res; } } 分解: 1) 2)如果先排序后判断,时间复杂度就不是线性的了,例如: Arrays.sort()时间复杂度为O(NlogN) 3)也不能用哈希,会有额外空间 复杂度分析:...原创 2021-06-04 10:47:21 · 99 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法(简单)
思路: 不能用普通的加减法,就用位运算,也就是二进制的加减法 代码: class Solution { public int add(int a, int b) { while(b!=0){ int c=(a&b)<<1;//c=进位 a=a^b;//a=非进位和 b=c;//将进位数赋给b=进位 } return a; } } 分解: 1)^是异或运算,与无进位和规律相同 &是与运算,与进位规律相同 ..原创 2021-05-16 09:35:42 · 178 阅读 · 0 评论