第一题:
参考思路解析:(遍历nums中的每个数字,得到不为0的数位即可。)
1.导入Scanner类:
import java.util.Scanner;
:引入Scanner
类,用于读取用户输入。
2.主方法:
public static void main(String[] args)
:定义主方法,程序的入口。
3.创建Scanner对象:
Scanner sc = new Scanner(System.in);
:创建Scanner
对象sc
,用于读取输入。
4.读取数组长度:
int n = sc.nextInt();
:读取数组的长度n
。sc.nextLine();
:消耗换行符,确保后续读取正确。
5.读取数组元素:
int[] arr = new int[n];
:创建一个长度为n
的整型数组arr
。for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); }
:通过循环读取n
个整数,并存储在数组arr
中。
6.初始化步数计数器:
int cnt = 0;
:初始化计数器cnt
,用于记录将所有数字变为0所需的步数。
7.遍历数组:
for (int num : arr) { ... }
:遍历数组中的每一个数字。
8.逐位处理每个数字:
while (num > 0) { ... }
:当数字num
大于0时,进入循环。if (num % 10 != 0) { cnt++; }
:如果数字num
的最后一位不为0,则步数计数器cnt
加1。num /= 10;
:将数字num
除以10,相当于删除数字的最后一位。
9.输出结果:
System.out.println(cnt);
:输出最终计算得到的步数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建一个扫描器对象,用于读取用户输入
Scanner sc = new Scanner(System.in);
// 读取数组长度 n
int n = sc.nextInt();
sc.nextLine(); // 消耗换行符,确保后续输入读取正常
// 创建一个数组 arr 用于存储输入的 n 个整数
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
// 读取数组中的每一个元素
arr[i] = sc.nextInt();
}
// 变量 cnt 用于记录将所有数字变为 0 所需的最少步数
int cnt = 0;
// 遍历数组中的每一个数字
for (int num : arr) {
// 对于每个数字,逐位处理,直到数字变为 0
while (num > 0) {
// 如果当前数字的最后一位不为 0
if (num % 10 != 0) {
// 需要删除这位,因此步数加 1
cnt++;
}
// 将数字除以 10,相当于删除最后一位
num /= 10;
}
}
// 输出最终计算得到的步数
System.out.println(cnt);
}
}
第二题:
参考版解题思路分析:(先拆分构建子串,再判断是否符合2个条件)
1.读取输入
- 使用Scanner读取字符串 长度 n,和实际的字符串 内容。并将字符串转换为字符数组“cs”。(常用的输入操作,务必 熟悉)
2.构建子串列表
- 初始化 一个"LinkedList"集合来存储子串
- 使用一个 "StringBuilder" 和一个字符变量"pre" 来构建连续相同字符的子串。
- 遍历字符数组"cs",当遇到不同的字符时,将当前子串添加到列表中,并重新开始构建新的子串
3.处理子串
- 遍历子串列表"list",检查每个子串的长度
- 如果子串长度是奇数,直接添加到结果列表"res"
- 如果子串长度是偶数且小于6,输出"-1"并返回。(边界为6:小于6的1-5没有符合条件的情况)
- 如果长度为偶数且不小于6的子串,拆分为两个符合条件的子串添加到结果列表"res"中;
4.输出结果 (有一些ACM输出格式必须需要熟悉,相关的拆分api方法)
- 将结果列表转换为字符串,并去除多余的符号(方括号和逗号),最终输出符合条件的子串。
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建扫描器对象,用于读取用户输入
Scanner sc = new Scanner(System.in);
// 读取字符串的长度 n
int n = sc.nextInt();
// 读取下一行(实际的字符串),并将其转换为字符数组
sc.nextLine();
char[] cs = sc.nextLine().toCharArray();
// 创建一个列表来记录每个相同字符的子串
List<String> list = new LinkedList<>();
// 初始化一个变量 pre 用于记录上一个字符
char pre = '.';
// 初始化一个 StringBuilder 对象,用于构建当前子串
StringBuilder sb = new StringBuilder();
// 遍历字符数组
for (int i = 0; i < cs.length; i++) {
// 如果 pre 是初始值 '.' 或当前字符与 pre 相同
if (pre == '.' || cs[i] == pre) {
// 更新 pre 为当前字符
pre = cs[i];
// 将当前字符添加到 StringBuilder 中
sb.append(cs[i]);
} else {
// 否则,将当前 StringBuilder 的内容添加到列表中
list.add(sb.toString());
// 重新初始化 StringBuilder 和 pre
sb = new StringBuilder();
pre = cs[i];
// 将当前字符添加到新的 StringBuilder 中
sb.append(cs[i]);
}
}
// 将最后一个子串再 手动添加到列表中
if (sb != null) list.add(sb.toString());
// 创建一个结果列表,用于存储符合条件的子串
List<String> res = new LinkedList<>();
// 遍历 list 中的每个子串
for (String s : list) {
// 如果子串的长度是奇数(题目已经限定了n>1)
if (s.length() % 2 != 0) {
res.add(s);//(那就ok了,是奇数肯定大于等于3,可以直接放res中)
} else {
// 如果子串的长度是偶数(又分小于6和大于等于6)
if (s.length() < 6) {
// 如果长度小于6,输出 -1 并返回(没法拆分成符合条件的)
System.out.println(-1);
return;
}else{
//否则就是长度为偶数且不小于6的子串,
//可以拆分成两个符合条件的子串添加到结果列表 res
// 将前3个字符aaa和剩余的字符aaaaa分别添加到结果列表中
//大于等于6的偶数 -3,都还是个 大于等于3的奇数!!
res.add(s.substring(0, 3));
res.add(s.substring(3));
}
}
}
// 输出结果,将结果列表转换为字符串,去除多余的符号
System.out.println(res.toString().replace("[", "").replace("]", "").replace(",", ""));
}
}
// 输出结果,将结果列表转换为字符串,去除多余的符号 System.out.println(res.toString().replace("[", "").replace("]", "").replace(",", ""));
String的replace()方法,在 输出格式中很常用!!
务必 熟悉。