JAVA算法刷题---DAY 4 Fib数列 单词搜索_JAVA 杨辉三角

本系列可作为 JAVAEE初阶 学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。

点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励! 

系列文章目录

JAVA初阶---------已更完

JAVA数据结构---------已更完

数据库初阶----------已更完

JAVA EE初阶---------正在更新

JAVA算法刷题---DAY 0 JAVA的快速IO

JAVA算法刷题---DAY1 数字统计、两个数组的交集、点击消除

JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离

JAVA算法刷题---DAY 3 简写单词 dd爱框框 除2!

JAVA算法刷题---DAY 4 Fib数列 单词搜索_JAVA 杨辉三角


目录

目录

系列文章目录

目录

前言

1.Fibonacci数列

描述

输入描述:

输出描述:

示例1

总体三步走

2.单词搜索

题目描述

输入

返回值

输入

返回值

输入

返回值

3.杨辉三角

描述

输入描述:

输出描述:

示例1

示例2

分步完整思路

步骤 1:初始化

步骤 2:逐行递推填充三角(核心易错点)

步骤 3:格式化打印,满足域宽 5 要求

总结


前言

小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!

今天的练习使用快速IO 详情可以查看 JAVA算法刷题---DAY 0 JAVA的快速IO

1.Fibonacci数列

题目链接:Fibonacci数列_牛客题霸_牛客网

描述

Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:

输入为一个正整数N(1 ≤ N ≤ 1,000,000)

输出描述:

输出一个最小的步数变为Fibonacci数"

示例1

输入:

15

复制输出:

2

总体三步走

  1. 生成斐波那契数列
  2. 找到 x 落在 两个斐波那契数 中间b < x ≤ c
  3. 计算 x 到左边 b 的距离x 到右边 c 的距离,输出最小的那个

import java.util.*; 
import java.io.*;
public class Main{
    public static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in=new Read();
    public static void main(String[] args) throws IOException{
        int x=in.nextInt();
        int a=0,b=1,c=1;
        while(x>c){
            a=b;
            b=c;
            c=a+b;
        }
        out.println(Math.min((c-x),(x-b)));
        out.close();
    }
}
class Read{
    StringTokenizer st=new StringTokenizer(" ");
    BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    String next() throws IOException{
        while(!st.hasMoreTokens()){
            st=new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    String nextLine() throws IOException{
        return bf.readLine();
    }
    int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
    long nextLong() throws IOException{
        return Long.parseLong(next());
    }
    double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
}

2.单词搜索

题目链接:单词搜索

题目描述

给出一个二维字符数组和一个单词,判断单词是否在数组中出现,

单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。

数据范围:

0 < 行长度 <= 100

0 < 列长度 <= 100

0 < 单词长度 <= 1000

例如:

给出的数组为["XYZE","SFZS","XDEE"]时,

对应的二维字符数组为:

若单词为"XYZZED"时,应该返回 true,

也即:


若单词为"SEE"时,应该返回 true,

也即:


若单词为"XYZY"时,应该返回 false。

示例1

输入

["XYZE","SFZS","XDEE"],"XYZZED"

["XYZE","SFZS","XDEE"],"XYZZED"

返回值

true

true

示例2

输入

["XYZE","SFZS","XDEE"],"SEE"

["XYZE","SFZS","XDEE"],"SEE"

返回值

true

true

示例3

输入

["XYZE","SFZS","XDEE"],"XYZY"

["XYZE","SFZS","XDEE"],"XYZY"

返回值

false

false
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board string字符串一维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    int m,n;
    int[] dx={0,0,1,-1};
    int[] dy={1,-1,0,0};
    boolean[][] vis;
    char[] arr;
    public boolean exist (String[] board, String word) {
        m=board.length;
        n=board[0].length();
        vis=new boolean[m][n];
        arr=word.toCharArray();
        
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i].charAt(j)==arr[0]){
                    if(dfs(board,i,j,0)==true) return true;
                }
            }
        }
        return false;
    }
    
    public boolean dfs(String[] board,int i,int j,int pos){
        if(pos==arr.length-1){
            return true;
        }
        vis[i][j]=true;
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 &&y<n && !vis[x][y] && board[x].charAt(y)== arr[pos+1]){
                if(dfs(board,x,y,pos+1)) return true;
            }
        }
        vis[i][j]=false;
        return false;
    }
    
    
    
}

3.杨辉三角

题目链接:杨辉三角_牛客题霸_牛客网

描述

杨辉三角形,又称帕斯卡三角形,第 i+1i+1 行是二项式展开 (a+b)i(a+b)i 的系数。
三角形中任意元素等于上一行同列元素与上一行前一列元素之和。
下面给出杨辉三角形的前 4 行:


11112113311111​123​13​1​


给定正整数 nn,请输出杨辉三角形的前 nn 行。

输入描述:

在一行输入一个整数 nn (1≦n≦34)(1≦n≦34)。

输出描述:

输出杨辉三角形的前 nn 行。每一行从该行第一个元素开始,依次输出;每两个数之间用一个空格分隔。请不要在行末输出多余的空格。

示例1

输入:

4

复制输出:

1
1 1
1 2 1
1 3 3 1

复制说明:

当 n=4n=4 时,杨辉三角形的前 4 行如上所示。

示例2

输入:

1

复制输出:

1

复制说明:

当 n=1n=1 时,杨辉三角形只有第 1 行,元素为 11。

分步完整思路

步骤 1:初始化

第一行只有一个数:dp[1][1] = 1

步骤 2:逐行递推填充三角(核心易错点)

i 从 2 循环到 n(从第 2 行开始填到第 n 行)

  • 固定规则 1:每行首位 dp[i][1] = 1
  • 固定规则 2:每行末尾 dp[i][i] = 1
  • 中间位置:j 从 2 到 i-1,公式 dp[i][j] = dp[i-1][j] + dp[i-1][j-1]

步骤 3:格式化打印,满足域宽 5 要求

  1. 外层 i 遍历每一行(1~n)
  2. 内层 j 只遍历到 i(第 i 行只有 i 个数字,不能多打)
  3. 手动用 StringBuffer 实现 5 字符右对齐:
    • 把数字转字符串,算出数字本身长度 len
    • 先拼接 5-len 个前置空格
    • 空格串拼接数字后打印,整体固定占 5 位宽度
  4. 每一行全部打完后换行
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int[][] dp=new int[n+1][n+1];
        dp[1][1]=1;
        for(int i=2;i<=n;i++){
            for(int j=2;j<=n;j++){
                dp[i][1]=1;
                dp[i][j]=1;
                dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
            }
        }
        for(int i=1;i<=n;i++){
            
            for(int j=1;j<=i;j++){
            StringBuffer ret=new StringBuffer();
            int len=Integer.toString(dp[i][j]).length();
            for(int k=0;k<5-len;k++){
                ret.append(" ");
            }
            System.out.print(ret.toString()+dp[i][j]);
            }
            System.out.println();

        }
    }
}


总结

以上就是今天要讲的内容,本文简单记录了算法刷题内容,仅作为一份简单的笔记使用,大家根据注释理解,您的点赞关注收藏就是对小编最大的鼓励!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yvonne爱编码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值