我们一起进大厂之leetcode算法刷题——递归、字符串转化为整数

1.求平方根

import java.util.*;

public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        // write code here
        return (int)Math.sqrt(x);
    }
}

2. 斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
题目解析

方法一:
普通递归版求法,这种方法通常和汉诺塔一起被放在课本的递归教学部分,应该是面试官不希望看到的算法。
利用上面递推式,自顶向下进行求解:

public class Solution {
    public int Fibonacci(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

方法二:
我们可以将递推式的求解从自顶向下改为自底向上(循环实现)。简而言之,我们已知前两项的值,然后我们就可以用前两项的值求出第3项的值,接着求第4、第5、……,直到求出第n项的值。

public class Solution {
    public int Fibonacci(int n) {
        int a = 0, b = 1;
        for (int i = 1; i <= n; i++) {
            a = a + b;
            b = a - b;
        }
        return a;
    }
}

方法三:
利用我们高中学过的“待定系数法”可以推导出斐波那契数列的通项公式。公式如下,(推导过程略)
在这里插入图片描述

public class Solution {
    public int Fibonacci(int n) {
        double a = Math.sqrt(5)/5;
        double b = Math.pow((1+ Math.sqrt(5))/2, n);
        double c = Math.pow((1- Math.sqrt(5))/2, n);
        return (int)(a * (b - c));
    }
}

3. 将字符串转化为整数

(暂时木全懂)

import java.util .*;

public class Solution {
    /**
     * @param str string字符串
     * @return int整型
     */
    public int atoi(String str) {
        // 若字符串为空或去除前后空格后为空,返回0
        if (str == null || str.trim().length() == 0) {
            return 0;
        }

        //处理掉前后空格并转化为字符串数组
        char[] arr = str.trim().toCharArray();

        int sign = 1, index = 0;
        //判断正负号
        if (arr[0] == '+')
            index++;
        if (arr[0] == '-') {
            sign = -1;
            index++;
        }

        int num = 0;
        for (int i = index; i < arr.length; i++) {
            if (arr[i] - '0' >= 0 && arr[i] - '9' <= 0) {
                //如果当前运算会越界的时候,直接输出结果
                if (num >= Integer.MAX_VALUE / 10) {//注意此处得/10,否则马上要超范围时,下一此更新num会数字跳变
                    if (sign > 0)
                        return Integer.MAX_VALUE;
                    else
                        return Integer.MIN_VALUE;
                }
                num = 10 * num + arr[i] - '0';//数字放在判断超出范围之后进行,防止马上要超范围时u,
                //  数字更新带来符号跳变           
            } else{
                //如果是字母,跳出循环
                break;
            }
        }
        return num * sign;
    }
}

你可能感兴趣的:(《算法刷题》系列,算法,leetcode,java)