首页 > 其他分享 >今日刷三题(day13):ISBN号码+kotori和迷宫+矩阵最长递增路径

今日刷三题(day13):ISBN号码+kotori和迷宫+矩阵最长递增路径

时间:2024-05-24 18:00:45浏览次数:14  
标签:ISBN Scanner kotori char int static day13 new public

题目一:ISBN号码

题目描述:

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

输入输出描述:

输入:0-670-82162-4                输出:Right
输入:0-670-82162-0                输出:0-670-82162-4

题目解析:

step1:首先将字符串转化为字符数组,并统计字符串长度为n。

step2:遍历整个除最后一个字符以外的字符数字,如果是数字,就乘以对应的位数,用sum统计累加之和。

step3:用ret=sum%11,如果计算出来的值与实际最后一个字符值相等,即s[n-1]-'0'==ret或者ret==10&&s[n-1]='X',返回Right;

如果不相等,更新s[n-1]的值,s[n-1]=(char) (ret==10?'X':ret+'0');并重新打印数组。

作答情况:

char类型转化为int类型搞不清楚:将字符减一个‘0’;

int类型转char类型:将数字加一个‘0’,并强制类型转换为char。

代码:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
      char[] s=in.next().toCharArray();
      int num=1;int sum=0;int n=s.length;
      int ret=0;
      for(int i=0;i<n-1;i++){
        if(s[i]>='0'&&s[i]<='9'){
            sum+=(s[i]-'0')*num;
            num++;
        }
      }
      ret=sum%11;//4
      if(ret==s[n-1]-'0'||ret==10&&s[n-1]=='X'){
        System.out.print("Right");
      }else{
        s[n-1]=(char) (ret==10?'X':ret+'0');
        for(int i=0;i<n;i++){
          System.out.print(s[i]);
        }
      }
    }
}

题目二:kotori和迷宫

题目描述:

kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?

输入输出描述:

输入描述:
第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30) 后面紧跟着n行长度为m的字符串来描述迷宫。'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口。保证输入合法。
输出描述:
若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)

若没有出口可以抵达,则输出-1。

题目解析:

step1:首先从键盘中读入二维数组arr[i][j],如果遇到了起点' k ',记录下起点的下标为x1,y1

step2:写宽度优先搜索bfs(),统计到出口的距离。

step3:更新结果,用count统计出口个数,用ret记录最小距离,遍历整个数组,如果arr[i][j]=='e'(出口)而且dist[i][j]!=-1 (能走到出口位置),count++,并且更新ret

作答情况:

①二维数组从键盘中读入,不会写。

②如果bfs宽度优先遍历的话,遍历上下左右四个方向不知如何处理。

③构造二维数组来求距离没有想到。

④没有做过迷宫问题,初次做觉得有些难。

代码:

import java.util.*;
public class Main{
     public static int N=35;
    public static int m,n;
     public static int x1,y1;
    public static char[][] arr=new char[N][N];
    public static int[][] dist=new int[N][N];
      public static int[] dx={0,0,-1,1};
    public static int[] dy={-1,1,0,0};
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        m=in.nextInt();
        n=in.nextInt();
        for(int i=0;i<m;i++){
            char[] temp=in.next().toCharArray();
            for(int j=0;j<n;j++){
                arr[i][j]=temp[j];
                if(arr[i][j]=='k'){
                    x1=i;y1=j;
                }
}
        }
        bfs();
        int count=0;int ret=1000;
        for(int i=0;i<m;i++){
          for(int j=0;j<n;j++){
              if(arr[i][j]=='e'&&dist[i][j]!=-1){
                  count++;
                  ret=Math.min(ret,dist[i][j]);
              }
          }
        }
        if(count==0) System.out.print(-1);
        else System.out.print(count+" "+ret);
    }
public static void bfs(){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                dist[i][j]=-1;
            }
        }
        Queue<int[]> q=new LinkedList<>();
        q.add(new int[]{x1,y1});
        dist[x1][y1]=0;
        while(!q.isEmpty()){
            int[] temp=q.poll();
            int a=temp[0]; int b=temp[1];
            for(int t=0;t<4;t++){
                int x=a+dx[t]; int y=b+dy[t];
                if(x>=0&&y>=0&&x<m&&y<n&&arr[x][y]!='*'&&dist[x][y]==-1){
                    dist[x][y]=dist[a][b]+1;
                    if(arr[x][y]!='e') q.add(new int[]{x,y});
                }
            }
        }
        
    }
}

题目三:矩阵最长递增路径

题目描述:

给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。
这个路径必须满足以下条件:

1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2. 你不能走重复的单元格。即每个格子最多只能走一次。

输入输出描述:

输入描述:
[[1,2,3],[4,5,6],[7,8,9]]


输出描述:5(1->2->3->6->9)

题目解析:

核心采用深度优先搜索dfs()

step1:判断特殊情况(空矩阵)

step2:两层for循环遍历每个节点并进行深度优先搜索dfs(),传入的参数有matrix,i,j,lastNum(上一个节点的值),len(路径长度)

step3:dfs()方法的步骤:记录当前的值准备递归——>将走过的路涂黑——>dfs四个方向——>回退记录的值 

step4:在dfs四个方向时注意下标是否越界和遍历到的值是否大于lastNum,这也是终止条件。

作答情况:

终止条件写的时候,只考虑到下标越界没有考虑到遍历到的值是否大于lastNum。

代码:

public class Main {
    public static int result;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int m=in.nextInt();int n=in.nextInt();
        int[][] matrix=new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                matrix[i][j]=in.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                dfs(matrix,i,j,-1,0);
            }
        }
        System.out.println(result);
    }
private static void dfs(int[][] matrix, int i, int j, int lastNum, int len) {
        if(i<0||j<0||i>=matrix.length||j>=matrix[0].length||matrix[i][j]<lastNum){
            result=Math.max(result,len);
            return;

        }
        int temp=matrix[i][j];
        matrix[i][j]=-1;
        dfs(matrix,i+1,j,temp,len+1);
        dfs(matrix,i-1,j,temp,len+1);
        dfs(matrix,i,j+1,temp,len+1);
        dfs(matrix,i,j-1,temp,len+1);
         matrix[i][j]=temp;
    }
}

收获:

①char类型转化为int类型:将字符减一个‘0’;

int类型转char类型:将数字加一个‘0’,并强制类型转换为char。

②从键盘中读入二维字符数组的写法:

Scanner in=new Scanner(System.in);
       int m=in.nextInt();
       int n=in.nextInt();
        for(int i=0;i<m;i++){
            char[] temp=in.next().toCharArray();
            for(int j=0;j<n;j++){
                arr[i][j]=temp[j];
            }
        }

③②从键盘中读入二维整形数组的写法:

 Scanner in=new Scanner(System.in);
        int m=in.nextInt();int n=in.nextInt();
        int[][] matrix=new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                matrix[i][j]=in.nextInt();
            }
        }

标签:ISBN,Scanner,kotori,char,int,static,day13,new,public
From: https://blog.csdn.net/qq_66767167/article/details/139153360

相关文章

  • m1_day13
    课程内容:Object类的核心方法集合框架集合之ArrayList集合Object类的核心方法:Object是Java中的鼻祖类所有类的直接父类/间接父类toString():制定一个对象打印显示的内容任何一个引用数据类型都默认继承Object类获得toString()方法在Object类中toString()......
  • JAVA语言学习-Day13
    参考教学视频:秦疆JVM概述JVM位置:操作系统之上JVM的体系结构.java->ClassFile->类加载器Classloader<-->运行时数据区RuntimeDataArea<-->本地方法接口<-本地方法库运行时数据区RuntimeDataArea<-->执行引擎方法区:MethodAreaJava栈:Stack本地方......
  • day13- 模块和包
    这节我们学习模块和包,这块呢,我们在实际使用的过程中,首先保证自己会用就可以,其次也可以加深对Python代码的理解。1、什么是模块开始之前,那我们思考下,之前学的过变量,函数属于一个模块吗?模块呢,就是Python程序,简单来说,就是一个.py的文件,就是属于一个模块那说明我们之前的函数和变......
  • day13-阶段总结
    1.知识补充1.1nolocal关键字在之前的课程中,我们学过global关键字。name='root'defouter():name="武沛齐"definner():globalnamename=123inner()print(name) #武沛齐outer()print(name) #123其实,还有一个nolocal......
  • 代码随想录算法训练营Day13|239滑动窗口最大值 347前k个高频元素
    学习了Carl的视频今日任务 239. 滑动窗口最大值 (一刷至少需要理解思路)之前讲的都是栈的应用,这次该是队列的应用了。本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。 题目链接/文章讲解/视频讲解:代码随想录 347.前 K 个高频元素 (一刷至少需要理......
  • ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......
  • ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......
  • C++ [NOIP2008 普及组] ISBN 号码
    文章目录一、题目描述[NOIP2008普及组]ISBN号码题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示二、参考代码一、题目描述[NOIP2008普及组]ISBN号码题目描述每一本正式出版的图书都有一个ISBN号码与之对应,IS......
  • P1055 [NOIP2008 普及组] ISBN 号码
    P1055[NOIP2008普及组]ISBN号码[NOIP2008普及组]ISBN号码题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括\(9\)位数字、\(1\)位识别码和\(3\)位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-6......
  • 全网最全最稳定中文ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......