2022-3-12 剑指offer day30


题1:

JZ65 不用加减乘除做加法

描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。   数据范围:两个数都满足 -10 \le n \le 1000?10n1000
进阶:空间复杂度 O(1)O(1),时间复杂度 O(1)O(1)
 
 1 public class Solution {
 2     public int Add(int num1,int num2) {
 3         while (num2!=0) {
 4             int c=(num1&num2)<<1;
 5             num1^=num2;
 6             num2=c;
 7         }
 8         return num1;
 9     }
10 }

思路:加法等于异或和 非进位和 和 与和 左移一位和的总和。

题2:

JZ15 二进制中1的个数

描述

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。   数据范围:- 2^{31} <= n <= 2^{31}-1?231<=n<=231?1 即范围为:-2147483648<= n <= 2147483647?2147483648<=n<=2147483647
 1 public class Solution {
 2     public int NumberOf1(int n) {
 3         int ans=0;
 4         if (n<0) {
 5             n&=Integer.MAX_VALUE;
 6             ans++;
 7         }
 8         
 9         while (n>0){
10             if (n%2==1) ans++;
11             n/=2;
12         }
13         return ans;
14     }
15 }

思路:负数先与最大int与,变成正数再计算,负数需要结果最后加上符号位。

相关