leetcode136 只出现一次的数字
class Solution {
public int singleNumber(int[] nums) {
//使用异或运算,异或运算具有以下性质
//任何数与0异或,结果为本身
//同一数异或,结果为0
//异或运算满足结合律和交换律
int res=0;
for(int num:nums){
res ^=num;
}
return res;
}
}
leetcode 137只出现一次的数字 II
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i=0;i<32;i++){
int count=0;
for(int j=0;j<nums.length;j++){
count+=nums[j]>>i&1;
}
if(count%3==1){
res |= 1<<i;
}
}
return res;
}
}
leetcode260 只出现一次的数字III
class Solution {
public int[] singleNumber(int[] nums) {
//本题关键是将数组分为两组,两个出现一次的元素分别被放在不同组,且相同的元素 在同一组
int m=0;//m为两个元素的异或结果
int index=1;
int a=0,b=0;
for(int i=0;i<nums.length;i++){
m^=nums[i];
}
while((index&m)==0){
index<<=1;
}
for(int num:nums){
if((num&index)!=0){
a^=num;
}else{
b^=num;
}
}
return new int[]{a,b};
}
}
剑指 65 不用加减乘除做加法
class Solution {
public int add(int a, int b) {
while(b!=0){
int temp = (a&b)<<1;//表示进位
a ^= b;//表示非进位和
b=temp;
}
return a;
}
}
剑指offer15 二进制中1的个数
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res=0;
int index =1;
for(int i=0;i<32;i++){
if((n&index)!=0) res++;
index<<=1;
}
return res;
}
}