2022-3-12 剑指offer day30
题1:
JZ65 不用加减乘除做加法
描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 数据范围:两个数都满足 -10 \le n \le 1000?10≤n≤1000进阶:空间复杂度 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<=21474836471 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与,变成正数再计算,负数需要结果最后加上符号位。