❤️大厂编程题实战+Leecode练习

Posted full-chair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️大厂编程题实战+Leecode练习相关的知识,希望对你有一定的参考价值。

前言+说明

❤️旺仔兄弟们!如果觉得博主分享的不错,希望能留下您的一键❤️三连❤️(点赞+评论+收藏) ,您的支持就是我的动力❤️,您的三连对我特别重要。
注明:下述题目只用于学习交流所用,禁止用于商业销售。同时在题解方面也希望大家能提出宝贵建议,共同进步❤️!

一、斐波那契数(Leecode_509)

题目描述:
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
     F(0) = 0,F(1) = 1
     F(n) = F(n - 1) + F(n - 2),其中 n > 1
     给你 n ,请计算 F(n) 。

样例1:

输入: 2
输出: 1
解释: F(2) = F(1) + F(0) = 1 + 0 = 1

样例2:

输入: 3
输出: 2
解释: F(3) = F(2) + F(1) = 1 + 1 = 2

样例.3:

输入: 4
输出: 3
解释: F(4) = F(3) + F(2) = 2 + 1 = 3

【方法一】:递归
参考代码:

import java.util.Scanner;

public class Leecode509_Fib {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = fib(n);
        System.out.println(ans);
    }
    public static int fib(int n){
        if (n<=1){
            return n;
        }else{
            return fib(n-1) + fib(n-2);
        }
    }
}

【结果裂开啦】

【方法二】:滚动数组
斐波那契数的边界条件是 F(0)=0和 F(1)=1。当 n>1 时,每一项的和都等于前两项的和,因此有如下递推关系:F(n)=F(n−1)+F(n−2)
由于斐波那契数存在递推关系,因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系,边界条件为 F(0) 和 F(1)。
根据状态转移方程和边界条件,可以得到时间复杂度和空间复杂度都是 O(n) 的实现。由于 F(n) 只和 F(n−1)与 F(n−2)有关,因此可以使用「滚动数组思想」把空间复杂度优化成 O(1)。

参考代码:

import java.util.Scanner;

public class Leecode509_Fib {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = fib(n);
        System.out.println(ans);
    }
    public static int fib(int n){
        int[] arr = new int[3];
        arr[0] = 0;arr[1]=1;
        if (n<=1){
            return n;
        }
        for (int i=2; i<=n; i++){
            arr[0] = arr[1];
            arr[1] = arr[2];
            arr[2] = arr[0]+arr[1];
        }
        return arr[2];
    }
}

二、字节跳动编程题(数列变换)

时间限制: 3000MS
内存限制: 1048576KB
题目描述:
存在两个长度相等数列a和b,其中存储的是正整数,判断有没有一个操作能使a数列变化成b数列。
操作:在数列a中选取一个区间a[l] - a[r],对这个区间中的所有数字加上一个正整数k。
其中,1 ≤ l ≤ r ≤ n,k ≥ 0。

输入描述

第一行: 表示 t 组数据;
第二行:n1​表示数列的长度;
第三行:X1    X2   X3   …   X n 表示a数列
第四行:Y1    Y2   Y3   …   Y n 表示b数列

接下来k行为其它 t-1 组数据

输出描述

YES或者NO

样例输入

2
6
3    7    1    4    1    2
3    7    3    6    3    2

样例输出

 YES
 NO

规则

请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果,点击“调试”亦可保持代码
编程题可以使用本地编译器,此页面不记录跳出次数

解题思路:
(1)用两个整数型数组分别来存放数列a、数列b;
(2)同时遍历数列a和数列b
   (2.1)如果数列相同位置值相同则继续遍历
   (2.2)如果数列相同位置值不相同:
        (2.2.1) 判断值不同的数组位置是否连续,不连续输出NO,连续的继续遍历;
        (2.2.2) 判断两数组相差的值相同且b数列的值 - a数列的值大于0,则继续遍历,否则输出NO;
(3)如果全部遍历完成且满足条件则输出YES。
参考代码:

import java.util.Arrays;
import java.util.Scanner;

public class Test01_Arrays {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] ans = new String[n];
        for (int i=0; i<n; i++){
            int m = sc.nextInt();
            int[] list1 = new int[m];
            int[] list2 = new int[m];
            for (int j=0; j<m; j++){
                list1[j] = sc.nextInt();
            }
            for (int j=0; j<m; j++){
                list2[j] = sc.nextInt();
            }
            if (isTransform(list1,list2)){
                ans[i]="YES";
            }else {
                ans[i]="NO";
            }

        }
        for (int i=0; i<ans.length; i++){
            System.out.println(ans[i]);
        }
    }
    public static boolean isTransform(int[] list1, int[] list2){
        if (list1.length==0 || list2.length==0){
            return false;
        }

        int temp=0;
        int point = 0;
        for (int i=0; i<list1.length; i++){
            if (list1[i] == list2[i])
                continue;
            if (list1[i] != list2[i]){
                if (point!=0 && point+1!=i){//判断是区间需要连续,如果不连续则返回false
                    return false;
                }
                point = i;
                if ((temp<0 || temp!=list2[i]-list1[i]) && temp!=0){//temp必须为正整数
                    return false;
                }
                temp = list2[i] - list1[i];
            }
        }
        return true;
    }
}

以上是关于❤️大厂编程题实战+Leecode练习的主要内容,如果未能解决你的问题,请参考以下文章

Leecode22. 括号生成——Leecode大厂热题100道系列

Leecode22. 括号生成——Leecode大厂热题100道系列

Leecode07. 整数反转——Leecode大厂热题100道系列

Leecode07. 整数反转——Leecode大厂热题100道系列

Leecode20. 有效的括号——Leecode大厂热题100道系列

Leecode20. 有效的括号——Leecode大厂热题100道系列