《LeetCode零基础指南》(第二讲) 函数

1.371. 两整数之和

/**给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。 */
class Solution {
    
    
    public int getSum(int a, int b) {
    
    
        return a + b;
    }
}

2.面试题 17.01. 不用加号的加法

/**设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 */
class Solution {
    
    //异或计算
    public int add(int a, int b) {
    
    
        int sum = 0, temp = 0;
        while(b!= 0){
    
    
            sum = a ^ b;
            temp = (a & b) << 1;//进位
            a = sum ;//此为未进位部分
            b = temp;//进位部分保存,再次计算
        }
        return a;//得到加法的结果
    }
}

3.剑指 Offer 65. 不用加减乘除做加法

/**写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 */
class Solution {
    
    
    public int add(int a, int b) {
    
    
        return a + b;
    }
}

4.面试题 08.05. 递归乘法

/**递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些*/
class Solution {
    
    
    public int multiply(int A, int B) {
    
    
        if(B == 0 || A == 0){
    
    
            return 0;
        }
        if(A > B){
    
    //A > B ,B减少
            return A + multiply(B - 1, A);//将乘转换为加上自己的倍数即可
        }
        return B + multiply(B, A - 1);
    }
}

5.69. Sqrt(x)

/**
1.给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
2.由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
*/
class Solution {
    
    //二分法
    public int mySqrt(int x) {
    
    
       int left = 0 , right = x; 
       if(right == 1 || right == 0){
    
    
           return right;
       }
       while (right - left > 1){
    
    
           int mid = (right - left) / 2 + left;
           if(x / mid < mid){
    
    //保留整数
               right = mid;
           }else {
    
    
               left = mid;
           }
       }
       return left;
    }
}

6.50. Pow(x, n)

/**实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 */
class Solution {
    
    //暴力
    public double myPow(double x, int n) {
    
    
        /*long  y = n;
        if(y < 0){
            x = 1 / x;
            y = -y;
        }
        double res = 1;
        for(long  i = 0; i < y ; i++){
            res = res*x;
        }
        return res;*/

        long N = n;
        return n >= 0 ? check (x,N) : 1 / check(x,-N);
    }
  
    public double check(double x, long N){
    
    
        if(N == 0){
    
    
            return 1.0;
        }
        double res = check(x, N>>1);
        //左操作数按位右移,移动右操作数指定的位数
        if(N % 2 == 1){
    
    
            return res* res * x;//平方数不够的可以额外乘x
        }else{
    
    
            return res *res;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52230126/article/details/121851832
今日推荐