1. 题目一:魔法印章
-
题目描述:
小红有一一个魔法印章,她准备把一个字符矩阵染成她想要的颜色。这个印章有个神奇的魔法,可以自由选择想要的颜色。但也有个限制,只能染一个十字区域。每次小红可以选择一个中心点, 将该点和上下左右最多2距离的点都染上指定的颜色。小红想让你输出最终矩阵的情况。 -
输入描述:
第一行输入三个正整数n、m和k,代表矩阵的行数、列数和小红的染色次数。接下来的k行,每行输入两个正整数x,y和一个字符C,代表小.红将中心坐标为(x,y) 的十字染上了c代表的颜色。字符矩阵初始全部是’. ',行的坐标从1到n,列的坐标从1到m。
1<x≤n<500
1<y<≤m<500
1<k:<105
c保证是小写字母。 -
输出描述
输出n行,每行一个长度为m的字符串,代表染色结束时的矩 -
示例一:
1)输入:
6 6 1
3 3 g
2)输出:
…g…
…g…
ggggg.
…g…
…g…
… -
示例二:
1)输入:
6 6 2
3 3 q
2 1 t
2)输出:
t.q…
ttt…
tqqqq.
t.q…
…q…
… -
代码展示
package Demo4_29;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int hang=cin.nextInt(); //矩阵的行数
int lie=cin.nextInt(); //矩阵的列数
int num= cin.nextInt(); //操作次数
cin.nextLine();
//1)输入:存储坐标和颜色
List<List<Integer>> data=new ArrayList<>();
List<String> color=new ArrayList<>();
while(num-->0){
List<Integer> list=new ArrayList<>();
list.add(cin.nextInt());
list.add(cin.nextInt());
color.add(cin.next());
cin.nextLine();
data.add(list);
}
System.out.println(data);
System.out.println(color);
//2)初始化数组
String[][] strings=new String[hang][lie];
for(int i=0;i<hang;i++){
for(int j=0;j<lie;j++){
strings[i][j]=".";
}
}
//3)循环染色
for(int i=0;i<color.size();i++){
ranse(strings,data.get(i),color.get(i),hang,lie);
}
//4)输出
for(int i=0;i<hang;i++){
for(int j=0;j<lie;j++){
System.out.print(strings[i][j]);
}
System.out.println(); //起到了换行作用
}
}
//方法:染色操作
public static void ranse(String[][] strings,List<Integer> place,String color,int hang,int lie){
//确定循环的上下左右值
int top=place.get(0)-2>=1?place.get(0)-2-1:0; //直接获得索引值
int low=place.get(0)+2<=hang?place.get(0)+2-1:hang-1; //直接获得索引值
int left=place.get(1)-2>=1?place.get(1)-2-1:0;
int right=place.get(1)+2<=lie?place.get(1)+2-1:lie;
for(int i=top;i<=low;i++) strings[i][place.get(1)-1]=color;
for(int i=left;i<=right;i++) strings[place.get(0)-1][i]=color;
}
}
2. 题目二:最大字符串
- 题目描述:
小红拿到了一一个仅包含数字和小数点(.“) 的字符串。她准备把这个字符串切分,使得切分后的每个数(整数或小数)都合法。小红想知道,切分后所有数之和的最大值是少。我们定义,合法的小数为:只包含一一个小数点, 且小数点的左和右均为数字字符。例如"0.23”、 “125.24”. “7.0"为合法小数,而”.45"、"345."为不合法小数。 - 输入输出描述:
1)输入:一个长度不超过10”的字符串,保证连续数字的长度不低于2,不超过10.
2)输出:切分后的和的最大值。保留-位小数。 - 示例:
1)示例一
(1):输入:12.23.45
(2):输出:20.6=12.2+3.4+5
2)示例二
(1):输入:220.022
(2):输出:242.0=220.0+22 - 代码展示
package Demo4_29;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
//1)输入
Scanner cin=new Scanner(System.in);
String string=cin.nextLine();
StringBuilder builder=new StringBuilder(string);
//2)以小数点进行分割,去小数点后一位
double sum=0;
int head=0;
//前面有少数点的
for(int i=0;i<builder.length();i++){
if(builder.charAt(i)=='.'){
String temp=builder.substring(head,i+2); //包前不包后
sum+=Double.parseDouble(temp);
head=i+2;
i++;
}
}
//没有少数点剩下的
String temp1=builder.substring(head,builder.length()); //包前不包后
sum+=Double.parseDouble(temp1);
//输出
System.out.println(sum);
}
}
- 注意事项
1)活用StringBuilder,可以灵活操作字符串
(1) builder.substring(1,2): 获得字符串的子串,包前不包后,添加索引值
(2)builder.append(),添加元素
(3)builder.insert(2,‘a’) :在指定索引值插入某个值
(4)builder.delete(2) ;builder.delete(2,3) :删除某个字符串后者某个连续的子串
2)总结一下类型转换的功能
(1)字符串转向基本数据类型:parseXxx() 或 valueOf() ;优先使用valueOf()
利用基本数据类型对应的包装类的parseXxx() 或 valueOf() 方法
package Demo4_29;
public class demo3 {
public static void main(String[] args) {
//字符串转别为基本数据类型
//1)方法一:包装类型:parseXXX()
String string1="00012";
String string2="00012.5";
String string3="false";
int Int1=Integer.parseInt(string1); //转变为整形,自动去零
float Int2=Float.parseFloat(string2); //转变为整形,自动去零
boolean Int3=Boolean.parseBoolean(string3); //转变为整形,自动去零
System.out.println(Int1);
System.out.println(Int2);
System.out.println(Int3);
//2)方法二:包装类型:valueOf()
String string11="00012";
String string22="00012.5";
String string33="true";
int Int11=Integer.valueOf(string11); //转变为整形,自动去零
float Int22=Float.valueOf(string22); //转变为整形,自动去零
boolean Int33=Boolean.valueOf(string33); //转变为整形,自动去零
System.out.println(Int11);
System.out.println(Int22);
System.out.println(Int33);
}
}
//输出
12
12.5
false
12
12.5
true
(2)基本数据类型转向字符串:1) 加上双引号12+“” ; 2) 使用String.valueOf() 3)
//1)基本数据类型转变为字符串
int A1=2;
long A2=2L;
float B1=2.2F;
double B2=2.2;
boolean C=false;
String string1=A1+""; //方法一:加上双引号“”
System.out.println("A1="+string1);
String string2=Float.toString(B1); //方法二:XXX.toString() 使用包装类
System.out.println("B1="+string2);
String string3=String.valueOf(C); //方法三:String.valueOf() 使用包装类
System.out.println("C="+string3);
//输出:
A1=2
B1=2.2
C=false
(3)数组类型转向字符串:使用Arrays.toString();Arrays.deepToString()
//2)集合类型转变为字符串:直接用toString(),得到的是地址;应该用Arrays.toString()
int[] D=new int[]{2,3,4,5}; //一维数组使用Arrays.toString()
String string4=D.toString();
System.out.println("D="+string4);
String string44=Arrays.toString(D);
System.out.println("D="+string44);
int[][] E=new int[][]{{2,3},{4,6}}; //多维数组使用Arrays.deepToString()
String string5=E.toString();
System.out.println("E="+string5);
String string55=Arrays.deepToString(E);
System.out.println("D="+string55);
//输出
D=[I@682a0b20
D=[2, 3, 4, 5]
E=[[I@3d075dc0
D=[[2, 3], [4, 6]]
(4)集合类型转向字符串:使用list.toString()
//3)集合类型,使用list.toString()
List<Integer> list=new ArrayList<>(Arrays.asList(2,3,4,5,6));
String string6=list.toString();
System.out.println("list="+string6);
//输出
list=[2, 3, 4, 5, 6]