模拟笔试 - 卡码网周赛第十八期(23年科大讯飞提前批笔试真题)

 第一题:

 参考思路解析:(遍历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()方法,在 输出格式中很常用!!

务必 熟悉。

第三题:

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值