OJ平台代码模板自动生成

article/2025/10/22 22:53:01

文章目录

  • 前言
  • 一、分析数据
  • 二、解析输入
    • 读取一个整数
    • 读取多行整数
    • 读取一行中的多个整数
  • 三、解析输出
    • 打印一个整数
    • 打印一个整数数组
  • 四、完整模板
  • 总结


前言

经常使用CSDN的小伙伴应该知道, 最近CSDN举办了好几期编程竞赛, 其中的编程模板, 都是有python脚本自动生成的, 这篇文章, 用以记录编程模板自动生成的开发过程.

我们以 java 语言为例进行讲解.

一、分析数据

要想自动化, 首先得发现数据的规律. 分析题库中的题目发现, 可以按照输入类型进行划分, 以下是可能的几个类型:

1、输入一个整数
2、输入一个定长的整数数组
3、输入一个变长的整数数组
4、输入一个定长的二维数组
5、输入一个行固定,列可变的二维数组
6、输入一个列固定,行可变的二位数组
7、输入多个整数
......

同样, 对于输出的数据, 也可以按类型划分, 以下是常见的几种可能的类型:

这里以整数为例

1、输出一个整数
2、输出一个整数数组
3、输出一个二维的整数数组
......

只要我们时间足够多, 就可以实现全部输入类型

二、解析输入

Java技能树的第一道题: A+B 为例
请添加图片描述

从输入数据上可以看出,该题属于输入多个整数类型

我们先来看看, Java 从命令行读取一个整数的代码:

读取一个整数

Scanner scan = new Scanner(System.in);
String str_0 = scan.nextLine().trim();
int a = Integer.parseInt(str_0);

这是一行一个整数的情况

读取多行整数

如果有多行, 每行都只有一个整数, 例如:

输入:
1
2
3

那我们只需要修改下变量名, 多读取几行就行了, 如:

Scanner scan = new Scanner(System.in);String str_0 = scan.nextLine().trim();
int a = Integer.parseInt(str_0);String str_1 = scan.nextLine().trim();
int b = Integer.parseInt(str_1);String str_2 = scan.nextLine().trim();
int c = Integer.parseInt(str_2);

是不是, 茅塞顿开, 原来这是有规律的 !

读取一行中的多个整数

那如果是一行中有多个整数呢?

也很简单, 不信你看 :

Scanner scan = new Scanner(System.in);String str_0 = scan.nextLine();
String[] line_list_0 = str_0.trim().split(" ");        
ArrayList<Integer> arr_temp = new ArrayList<>();
for(int i = 0; i < line_list_0.length; i++){arr_temp.add(Integer.parseInt(line_list_0[i]));
}int a = arr_temp.get(0);
int b = arr_temp.get(1);

同理, 读取一个整型数组 :

Scanner scan = new Scanner(System.in);String str_0 = scan.nextLine();
String[] line_list_0 = str_0.trim().split(" ");        
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 0; i < line_list_0.length; i++){arr.add(Integer.parseInt(line_list_0[i]));
}

这里都不需要考虑是定长数组还是变长数组

如果是写C语言的编程模板,就需要考虑变长数组需要动态分配内存的情况

那么, 读取一个二维数组是怎样的呢?

请看 :

Scanner scan = new Scanner(System.in);String str_0 = scan.nextLine().trim();
int q = Integer.parseInt(str_0);ArrayList<ArrayList<Integer>> arr = new ArrayList<>();
for(int i = 0; i < q; i++){String str_3 = scan.nextLine();String[] line_list_3 = str_3.trim().split(" ");        ArrayList<Integer> temp_3 = new ArrayList<>();for(int j = 0; j < line_list_3.length; j++){temp_3.add(Integer.parseInt(line_list_3[j]));}arr.add(temp_3);
}

这里也不需要考虑列数 (C语言是需要考虑的) , 其中, q 表示输入数据的行数

其他的输入类型, 这里就不一一列举了

三、解析输出

相对解析输入来说, 解析输出就要简单很多

打印一个整数

int result = solution(n, vector);
System.out.println(result);

打印一个整数数组

ArrayList<Integer> result = solution(n, q, nums, arr);for (int i = 0; i < result.size(); i++){System.out.println(result.get(i));
}

打印二维数组也是同理, 这里留给读者自己尝试

四、完整模板

以下是其中一个例子:

## 输入描述
第一行输入宝物的数量n(1<n<100)和可选择宝物的总质量M(0<=M<=1000)。 
以下n行每行输入两个数m和v(1<m<100, 1<v<100),表示这n个宝物其各自的重量和价值。## 输入样例
5 10
2 3
5 3
4 5
6 2
4 2
import java.util.ArrayList;
import java.util.Scanner;class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str_0 = scan.nextLine();String[] line_list_0 = str_0.trim().split(" ");        ArrayList<Integer> arr_temp = new ArrayList<>();for(int i = 0; i < line_list_0.length; i++){arr_temp.add(Integer.parseInt(line_list_0[i]));}int n = arr_temp.get(0);int M = arr_temp.get(1);ArrayList<ArrayList<Integer>> vector = new ArrayList<>();for(int i = 0; i < n; i++){String str_2 = scan.nextLine();String[] line_list_2 = str_2.trim().split(" ");        ArrayList<Integer> temp_2 = new ArrayList<>();for(int j = 0; j < line_list_2.length; j++){temp_2.add(Integer.parseInt(line_list_2[j]));}vector.add(temp_2);}scan.close();int result = solution(n, M, vector);System.out.println(result);}public static int solution(int n, int M, ArrayList<ArrayList> vector){int result = 0;// TODO: 请在此编写代码return result;}
}

细心的同学应该发现了, 我这里都是以整数为例子, 其他类型的变量, 也是一样的, 只需判断输入数据的变量类型即可, 如:

def is_float_num(str):s=str.split('.')if len(s)>2:return Falseelse:for si in s:if not si.isdigit():return Falsereturn Truedef is_number(i):try:int(i)return Trueexcept:return Falsedef parse_input_one(item, var_name, input_var_idx = 0, assgin_var_type=None):var_type = Nonevar_def = Nonevar_input = Noneif assgin_var_type is not None:var_type = assgin_var_typevar_def_ = f"{assgin_var_type} {var_name} = str_{input_var_idx}"else:if is_number(item):var_type = "int"var_def_ = f"int {var_name} = Integer.parseInt(str_{input_var_idx})"elif is_float_num(item):var_type = "float"var_def_ = f"float {var_name} = Float.parseFloat(str_{input_var_idx})"else:var_type = "String"var_def_ = f"String {var_name} = str_{input_var_idx}"var_def = f"{var_type} {var_name}"input_template = f"String str_{input_var_idx} = scan.nextLine().trim();"var_input = f"{input_template}\n\t\t{var_def_}"return var_type,var_name, var_def, var_input

我这里只考虑了常用的三种类型, 如果是其他类型, 可以通过参数assgin_var_type来控制.

以上模板生成的脚本代码, 是使用python来实现的.

总结

1、深度分析数据后才能发现数据的规律

一开始leader将这个jira分给我的时候, 我觉得这模板代码没法自动生成, 很是抗拒
自己写了几个 python 的 oj 模板后才发现这确实是有规律可循的

2、年轻人不要浮躁

OJ比赛感兴趣的同学, 可以参加 CSDN编程竞赛第四期
若发现 OJ 模板有任何问题, 可直接在评论区反馈


http://chatgpt.dhexx.cn/article/6VTsoG51.shtml

相关文章

OJ平台输入输出注意事项

文章目录 输入输出多组数据的处理输入不给你说有几组输入给你说输入几组不给你说有几组输入&#xff0c;但是会有一个特殊输入作为结束标志。 输出两组数据之间没有空行两组数据之间存在空行输出之间有空行 输入输出 多组数据的处理 由于ACM竞赛题目的输入数据和输出数据一般…

C++/Linux实战项目 - 负载均衡式在线OJ平台

目录 总览 简述 项目核心的三个模块 项目宏观结构 compile_server 编译与运行服务 总览分析 compiler.hpp runner.hpp compile_run.hpp compile_server.cc oj_server 基于MVC结构的oj服务设计 总览分析 Model 提供对数据的操作方法 View 使用后端数据对前端页面进…

OJ平台架构/用户权限验证/JAVA后端开发

转载自: 我的个人博客 OJ实验平台&#xff0c;采用沙箱后端运行代码&#xff0c;实现安全的实时评测&#xff08;OJ&#xff09;。此平台搭建的初衷为学校的数据结构实验提供课程代码的编写和测评&#xff0c;以此方便学生实验时得到实时的反馈&#xff0c;此后陆续被多个实验…

sql中检查时间是否重叠

先画一个时间轴&#xff0c;方便理解。 设新的时间块&#xff0c;开始时间为start&#xff0c;结束时间为end。数据库中的数据为item 这样可以直观的看出来&#xff0c;新的时间块插入进来&#xff0c;只需要判断 start<item.end and end > item.start 即可 当然上…

JS判断多个时间段是否有重叠(时分)

多个时间段比较 let dateAr [{ s: 01:00, e: 14:08 },{ s: 01:04, e: 02:05 },{ s: 05:21, e: 08:00 },{ s: 10:20, e: 12:08 }, ] function Fn() {for (let k in dateAr) {if (!judege(k)) {return false}}return true } function judege(idx) {for (let k in dateAr) {if (…

合并所有重叠的区间

Python-合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 示例 1: 输入&#xff1a;interva…

关于sql语句中,统计时间重叠和时间不重叠

关于sql统计时间重叠和时间不重叠的问题 我们在开发过程中总会遇到这样的情况&#xff0c;一行数据中&#xff0c;有id、组、开始时间、结束时间。但是开始时间和结束时间肯定会出现时间重叠问题&#xff0c;比如说下面这种情况。 我们先找出时间重叠的公式&#xff1a; 可以发…

开始时间与结束时间重叠

let endNum ; //整个二维数组for(let itemName of showDate) {//for (let i 0; i < itemName.children.length; i) {if(itemName.screenId itemName.children[i].screenId) {// console.log(itemName.children[i])//把开始时间和结束时间转化成时间戳if(parseInt(itemNam…

在SQL Server中合并重叠日期

1.合并SQL中的时间重叠的记录方法:A --创建临时表&#xff0c;里面有重叠的日期declare t table (Name varchar(100), starttime datetime, endtime datetime); insert into t values(A , 2017-01-02 00:00 , 2017-03-28 00:10),(A , 2017-05-14 23:50 , 2017-05-29 23…

Java判断多个时间段是否重叠

因为项目需求用到比较给定时间段是否与已知时间段有重叠&#xff0c;所以写了一个比较简单易懂的方法&#xff0c;经测试可以满足本人目前的需求&#xff0c;大家如果发现该方法有什么问题可以提出来&#xff0c;如果有更好的方法也可以分享。 package com.demo;import java.u…

SQL中如何求解时间重叠的问题?

点击上方SQL数据库开发&#xff0c;关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 问题描述 时间重叠指上下两行数据的时间段有重叠部分&#xff0c;现在要找出这些在时间上有重叠的记录。 具体问题 有7个会议室&#xff0c;每个会议室每天都有人开…

多个日期时间段进行合并计算时长,剔除重叠时间段

多个日期时间段进行合并&#xff0c;算出经历的时长_itrytellyou的博客-CSDN博客_多个时间段合并多个日期时间段进行合并&#xff0c;算出经历的时长背景描述思路代码背景描述在公司进行人员描图模块开发时&#xff0c;涉及到了人员参会时长和参会次数的数据&#xff0c;比如一…

【js】判断时间段之间是否有重叠

一、需求 可以有多个时间段&#xff08;hh:mm&#xff09;&#xff0c;添加下一个时间段以及提交时需要判断各个时间段不能交叉&#xff0c;如下图&#xff1a; 一、方法 let dateAr [{ s: 02:00, e: 03:00 },{ s: 03:00, e: 04:01 },{ s: 05:00, e: 06:00 },{ s: 07:00, e:…

SQL中的时间重叠问题

点击关注上方“SQL数据库开发”&#xff0c; 设为“置顶或星标”&#xff0c;第一时间送达干货 SQL专栏 SQL基础知识第二版SQL高级知识第二版 问题描述 时间重叠指上下两行数据的时间段有重叠部分&#xff0c;现在要找出这些在时间上有重叠的记录。 具体问题 有7个会议室&#…

判断两个时间段交集、时间重叠问题

判断两个时间段范围是否有交集(时间重叠)问题经常遇到&#xff0c;比如预约会议室开会&#xff0c;活动的开始结束等&#xff0c;本文做此分析。 前提&#xff1a;本文时间传参已做限制&#xff0c;结束时间必须大于开始时间 1、正向思维 代码如下 (oneStartTime < other…

判断时间范围是否重叠(原理)

首先问题来源&#xff1a;因为业务需求需要在前端设置一个时间范围&#xff0c;并且可以多次增加&#xff0c;但要保证时间范围不重叠。某一个时间范围内做特定的事情。 让我们来分析一下时间重叠有几种情况 第一种情况&#xff1a;R1的开始时间在R2时间范围内 图① 第二种情…

企业物联网平台如何选择?

物联网平台的考虑因素都有哪些&#xff1f; 通常&#xff0c;物联网平台在安全功能、协议、数据格式、数据分析和可视化能力&#xff0c;以及所提供的应用环境方面进行比较。有很多物联网平台&#xff0c;它们可能拥有全套功能&#xff0c;但可能仍然无法胜任客户任务需求。一…

物联网技术,主要包括哪些核心技术

物联网的关键技术有识别和感知技术&#xff0c;网络与通信技术&#xff0c;数据挖掘与融合技术。 1.识别和感知技术 最常见的就是生活的的二维码了。 通过二维码&#xff0c;我们可以和图片&#xff0c;网址&#xff0c;软件&#xff0c;整个世界联系起来。 2.网络与通信技…

什么是物联网平台

1、什么是物联网平台 阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提供云端API&#xff0c;服务端通过调用云端API将指令下发至设备端&#xff0c;实现远程控制。 物联网平台消息通信流程…

物联网是什么,和互联网之间主要有什么区别

物联网概念最早可追溯到1990年&#xff0c;但当时并未引起重视。而随着互联网的普及、科技的发展&#xff0c;物联网在近年来备受关注&#xff0c;并成为一个新经济增长点的战略新兴产业。 物联网(InternetofThings)&#xff0c;顾名思义就是"物物相连的互联网";更为…