JZ65 不用加减乘除做加法⭐
1 /* ^模拟不进位相加, &模拟进位(递归) */ 2 public class JZ65_1 3 { 4 public static int Add(int num1, int num2) 5 { 6 if (num2 == 0) return num1; 7 return Add(num1 ^ num2, (num1 & num2) << 1); 8 } 9 } 10 11 /* ^模拟不进位相加, &模拟进位(非递归) */ 12 public class JZ65_2 13 { 14 public static int Add(int num1, int num2) 15 { 16 int add = num1 ^ num2; 17 int up = (num1 & num2) << 1; 18 while (up != 0) 19 { 20 add = add ^ up; 21 up = ((add ^ up) & up) << 1; 22 } 23 return add; 24 } 25 }
JZ15 二进制中1的个数
1 /* 模拟1 */ 2 public class JZ15_1 3 { 4 public static int NumberOf1(int n) 5 { 6 int res = 0; 7 while (n != 0) 8 { 9 if ((n & 1) == 1) 10 res++; 11 n >>>= 1; 12 } 13 return res; 14 } 15 } 16 17 /* ⭐模拟2⭐ */ 18 public class JZ15_2 19 { 20 public static int NumberOf1(int n) 21 { 22 int res = 0; 23 while (n != 0) 24 { 25 n = n & (n - 1); 26 res++; 27 } 28 return res; 29 } 30 } 31 32 /* 模拟3 */ 33 public class JZ15_3 34 { 35 public static int NumberOf1(int n) 36 { 37 int res = 0; 38 for (int i = 0; i < 32; i++) 39 { 40 if ((n & (1 << i)) != 0) 41 res++; 42 } 43 return res; 44 } 45 } 46 47 /* 模拟4 */ 48 public class JZ15_4 49 { 50 public static int NumberOf1(int n) 51 { 52 String s = Integer.toBinaryString(n); 53 return (int) s.chars().filter(c -> c == '1').count(); 54 } 55 }
JZ16 数值的整数次方
1 /* 减治 */ 2 public class JZ16_1 3 { 4 public static double Power(double base, int exponent) 5 { 6 if (exponent == 0) 7 return 1; 8 else if (exponent == 1) 9 return base; 10 if (exponent == -1) 11 return 1.0 / base; 12 double half = Power(base, exponent / 2); 13 return half * half * Power(base, exponent % 2); 14 } 15 } 16 17 /* 快速幂 */ 18 public class JZ16_2 19 { 20 public static double Power(double base, int exponent) 21 { 22 if (exponent < 0) 23 { 24 base = 1 / base; 25 exponent = -exponent; 26 } 27 return quick(base, exponent); 28 } 29 30 public static double quick(double base, int exponent) 31 { 32 double ans = 1; 33 while (exponent != 0) 34 { 35 if (exponent % 2 == 1) ans *= base; 36 exponent /= 2; 37 base *= base; 38 } 39 return ans; 40 } 41 }
JZ56 数组中只出现一次的两个数字⭐
1 /* hash */ 2 public class JZ56_1 3 { 4 public static int[] FindNumsAppearOnce(int[] nums) 5 { 6 HashMap<Integer, Object> map = new HashMap<>(); 7 int[] res = new int[2]; 8 for (int num : nums) 9 { 10 if (map.containsKey(num)) 11 map.remove(num); 12 else 13 map.put(num, null); 14 } 15 ArrayList arrayList = new ArrayList(map.keySet()); 16 res[0] = (int) arrayList.get(0); 17 res[1] = (int) arrayList.get(1); 18 return res; 19 } 20 21 } 22 23 /* 根据只出现一次的两个数字的异或结果的"1"位置作为分组条件 */ 24 public class JZ56_2 25 { 26 public static int[] FindNumsAppearOnce(int[] nums) 27 { 28 int res1 = 0, res2 = 0, temp = 0, flag = 1; 29 for (int num : nums) 30 temp ^= num; 31 while (((temp & flag) ^ flag) != 0) 32 flag <<= 1; 33 for (int num : nums) 34 { 35 if ((num & flag) == 0) 36 res1 ^= num; 37 else 38 res2 ^= num; 39 } 40 return new int[]{Math.min(res1, res2), Math.max(res1, res2)}; 41 } 42 }
JZ64 求1+2+3+...+n
1 /* 这题意义不大 */ 2 public class JZ64_1 3 { 4 public static int Sum_Solution(int n) 5 { 6 boolean b = (n != 0) && ((n += Sum_Solution(n - 1)) > 0); 7 return n; 8 } 9 }标签:return,运算,offer,int,res,base,public,exponent From: https://www.cnblogs.com/VividBinGo/p/17717039.html