leetcode136 只出现一次的数字

  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. //使用异或运算,异或运算具有以下性质
  4. //任何数与0异或,结果为本身
  5. //同一数异或,结果为0
  6. //异或运算满足结合律和交换律
  7. int res=0;
  8. for(int num:nums){
  9. res ^=num;
  10. }
  11. return res;
  12. }
  13. }

leetcode 137只出现一次的数字 II

  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. int res = 0;
  4. for(int i=0;i<32;i++){
  5. int count=0;
  6. for(int j=0;j<nums.length;j++){
  7. count+=nums[j]>>i&1;
  8. }
  9. if(count%3==1){
  10. res |= 1<<i;
  11. }
  12. }
  13. return res;
  14. }
  15. }

leetcode260 只出现一次的数字III

  1. class Solution {
  2. public int[] singleNumber(int[] nums) {
  3. //本题关键是将数组分为两组,两个出现一次的元素分别被放在不同组,且相同的元素 在同一组
  4. int m=0;//m为两个元素的异或结果
  5. int index=1;
  6. int a=0,b=0;
  7. for(int i=0;i<nums.length;i++){
  8. m^=nums[i];
  9. }
  10. while((index&m)==0){
  11. index<<=1;
  12. }
  13. for(int num:nums){
  14. if((num&index)!=0){
  15. a^=num;
  16. }else{
  17. b^=num;
  18. }
  19. }
  20. return new int[]{a,b};
  21. }
  22. }

剑指 65 不用加减乘除做加法

  1. class Solution {
  2. public int add(int a, int b) {
  3. while(b!=0){
  4. int temp = (a&b)<<1;//表示进位
  5. a ^= b;//表示非进位和
  6. b=temp;
  7. }
  8. return a;
  9. }
  10. }

剑指offer15 二进制中1的个数

  1. public class Solution {
  2. // you need to treat n as an unsigned value
  3. public int hammingWeight(int n) {
  4. int res=0;
  5. int index =1;
  6. for(int i=0;i<32;i++){
  7. if((n&index)!=0) res++;
  8. index<<=1;
  9. }
  10. return res;
  11. }
  12. }