算法题的ACM模式与核心代码模式

2023-10-27

不同的刷题模式

身为一名程序员,刷题网站系统我们应该再熟悉不过了,除了针对竞赛的 OJ 系统,比如:POJ;还有很多专为求职提供的刷题 OJ 系统,比如:leetcode牛客网 等。

这两类 OJ 在刷题模式上有些区别,一般竞赛的 OJ 系统是针对 ACM 模式的,而求职的 OJ 系统是针对核心算法模式的,也就是模板速刷模式,这两种系统有什么区别?

ACM 模式:在实现题目过程中,所有的输入和输出触发方式必须严格按照题目的描述进行,数据需要自己构造输入,OJ 不会提供任何代码,包括 include 都需要自己写,输出的格式也需要自行控制格式,即便输入输出结果正确,但因为格式控制错误也无法通过 OJ。

比如下面代码实例:

#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) {
        printf("%d\n", a + b);
    }
    return 0;
}

核心代码模式:代码中增加了可以正确通过的代码虚化模式,已经将需要数据的数据放入容器了,可以直接开始写逻辑,实现算法接口的内容即可。这种模式只需要把结果填充到要返回的容器中即可,你只需要关心算法的核心,而不必留意算法的输入输出控制。

比如下面代码实例:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
    }
};

这两种模式各自都有优点,ACM 模式的代码是要求直接可以在本地运行的,但是需要自己写 include 哪些库函数,输入和输出格式控制等,在本地调试也是非常方便,但在代码调试正确后提交前,不要忘了删掉调试的代码。从上面两种模式的代码来看,ACM 模式要比核心代码模式多写不少代码,因为这个算法太简单,差距还不是那么大。反而核心代码模式测侧重点全部放在算法逻辑上,但是调试上可能没有 ACM 模式那么方便,需要自行进行添加非核心部分代码,下面将会说到。

国内一些企业很多面试都放在牛客上进行,所以这种 ACM 模式还需要熟悉,如果之前只在在 LeetCode 上刷题,可以去 POJ 上熟悉一下。

力扣上的代码在本地编译运行

上面说过 LeetCode 的代码是核心代码模式的,如果想要在 LeetCode 上调试,可以打日志的,C++ 直接使用 cout 啥就不用说了。但是有时候日志太多或者打日志也不太容易解决 bug,只能通过调试器 gdb 等工具,如果才能将力扣代码在本地运行。其实很简单,拿上面两数之和的代码举例,完整的可以在本地运行的代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

//LeetCode代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};

//添加的调试代码
int main()
{
    int a[] = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    int target = 200;
    vector<int> nums(a, a + sizeof(a) / sizeof(int));
    Solution solution;
    for (int num : solution.twoSum(nums, target))
    {
        cout << num << " " << endl;
    }
}

从代码中可以看到,其实就是定义一个 main 函数,自己构造输入用例,调用 LeeCode 上 Solution 类定义的 twoSum 方法,然后打印出结果即可。可以在本地随意构造测试数据,随意打日志,随意使用 gdb 调试,bug 一定会被找到的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法题的ACM模式与核心代码模式 的相关文章

  • Redis集群部署的三种方式

    Redis集群的部署方式 1 主从复制 2 Sentinel哨兵机制 3 cluster集群 第一种集群方式 部署简单 分为一主一从 或一主N从 数据分布是在所有节点通过replication复制全量的数据 如果主节点挂掉 需要手动把其中的
  • Java中的集合框架有哪些类?

    Java中的集合框架是一个用于存储和操作对象的集合类库 提供了一系列的接口和类 用于支持不同的集合类型 在Java中 集合框架主要由接口 实现类 算法和数组工具类等四个部分组成 接口 Java中的集合框架提供了一系列接口 其中最核心的是Co

随机推荐

  • 使用LL库开发STM32:UART基础使用

    文章目录 目的 基础说明与初始化 基础说明 初始化配置 数据接收和发送 轮询方式 中断方式 DMA方式 总结 目的 UART 异步串口 是单片机非常常用的一个功能 一般用作设备或模块间通讯的一种方式 通常所说的232或是485通讯从写程序的
  • 做uni-app时,遇到后台返回base64码,将base64码转为图片,但是图片没有显示出来的解决方法

    在做uni app项目时 遇到一个问题时 后台返回一长串码 前端这边需要将base64码进行转化为图片 做法如下 首先调接口获取到后台返回的base64码 如下图 记得调用这个方法哦 获取到的base64码如下 接下来呢在页面需要的地方给他
  • 日常问题——git推送代码被拒绝

    作 者 是江迪呀 本文关键词 日常BUG BUG 问题分析 每日 一言 存在错误说明你在进步 一 问题描述 Push to origin master was rejected 提交代码时提示 被拒绝 二 问题原因 权限问题 你可能没有足够
  • 数据结构(C语言)第二版 第八章课后答案

    数据结构 C语言 第二版 第八章课后答案 1 选择题 1 5 C D B D C 6 10 B C D B C 11 15 B C C D A 1 从未排序序列中依次取出元素与已排序序列 初始时为空 中的元素进行比较 将其放入已排序序列的正
  • 5分钟理解String的'+'的性能及原理

    1 String的 底层执行 及效率问题 2 StringBilder与StringBuffer的比较 本篇博文先介绍第一个问题 为了让大家看明白 我们举例说明吧 为了加深理解 我们可以来做几个小实验 javac Test 编译文件 jav
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • Activity跳转到Fragment 然后再返回此Fragment

    此方法可通过广播的形式较为简单 此处用EventBus3 0 0来发广播 activity中写 if EventBus getDefault isRegistered this EventBus getDefault register th
  • Java 图片与byte数组互相转换

    图片到byte数组 public byte image2byte String path byte data null FileImageInputStream input null try input new FileImageInput
  • 一、【脚本命令】build_chain.sh 区块链节点生成(ubuntu18.04/FISCO BCOS)-JAVA

    目录 环境依赖 1 下载 build chain sh 2 脚本命令参数 3 生成区块链配置文件ip list 4 调用build chain sh脚本构建区块链节点 5 启动节点 6 查看节点进程 总结 环境依赖 名称 版本 FISCO
  • error while loading shared libraries: libGLU.so.1: cannot open shared object file: No such file or

    总结 apt search libglu apt install libglu1 mesa 两种可能 没安装相关的包 安装了相关的包但没找到 判断是哪种可能 https blog csdn net u011132979 article de
  • c语言复习笔记(一)——操作符和表达式

    前言 操作符 前言 一 算术操作符 1 基本的算术运算符 2 自增运算符和自减运算符 二 移位操作符 左移位操作符规则 右移操作符的规则 位操作符 三 sizeof运算符 四 逻辑操作符 五 逗号表达式 六 整形提升 七 自动类型转换 一
  • uniapp微信小程序常用防抖函数及调用

    先看代码 复制使用即可 防抖一般用于按钮使用 避免如登陆 购买等多次调用 如多次点击购买按钮在网速较慢下可能生成多个订单信息等 这里只是一个封装调用的简单流程 如您使用我们官方产品 uview 防抖参考 throttle debounce节
  • 基于新浪云服务器的微信公众号

    基于新浪云服务器的微信公众号 本微信公众号是智能浴室排雾及浴室滑倒报警系统的一个分支 通过设备上传到ONENET云平台 新浪云服务器调用云平台数据再反馈给微信公众号 从而实现微信公众号实时获取设备数据和发送报警信息给指定用户 因为只是代码放
  • 自动完成文本框(AutoCompleteTextView)的功能及用法

    自动完成文本框AutoCompleteTextView是从EditText派生而出的 也属于是一个文本编辑框 但是 他比普通编辑框多一个功能 当用户输入一定字符后 自动文本框会显示一个下拉菜单 供用户从中选择 当用户选择某个菜单项之后 Au
  • Spring 如何解决循环依赖的问题(三级缓存)

    一 Spring IOC容器 对象循环依赖 1 什么是循环依赖 what 1 循环依赖 gt 循环引用 gt 即2个或以上bean 互相持有对方 最终形成闭环 eg A依赖B B依赖C C又依赖A 注意 这里不是函数的循环调用 是个死循环
  • c ++比较字符串是否相等_在C ++中比较字符串的3种方法

    c 比较字符串是否相等 In this tutorial we ll learn methods to compare strings in C Consider a scenario wherein you are required to
  • MFC之文档视图案例30

    1 文档视图案例的初始化 1 创建基于单文档的MFC程序 但是到下图步骤时 需要换一下视图的继承基类为CFormView 这样下面我们就多出了FORM这个对话框 以前单文档继承于CView时是没有对话框的 所以无法操作控件 2 然后按如下所
  • 2021年最新Python讲义:面向对象(OOP)基本概念

    面向对象 OOP 基本概念 面向对象编程 Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面相过程 和 面相对象 是两种
  • 无监督学习之聚类方法(K-Means、层次聚类)

    一 导入 无监督学习中需要对无标记样本进行训练学习进而找到数据的内在性质和逻辑结构 聚类方法是为了为无监督学习的数据分析提供的基础学习方法 聚类将数据集划分为若干个子集 每个子集称为类或者簇 如果一个样本只属于一个类 簇 则是硬聚类 如果某
  • 算法题的ACM模式与核心代码模式

    不同的刷题模式 身为一名程序员 刷题网站系统我们应该再熟悉不过了 除了针对竞赛的 OJ 系统 比如 POJ 还有很多专为求职提供的刷题 OJ 系统 比如 leetcode 牛客网 等 这两类 OJ 在刷题模式上有些区别 一般竞赛的 OJ 系