题目一: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