【从零到一的笔试突破】——day1笔试巅峰(6道笔试题)ACM模式让笔试更有感觉

文章目录

  • 数字统计(数学+模拟)
  • 两个数组的交集(哈希)
  • 点击消除(栈)
  • 牛牛的快递(模拟)
  • 最小花费爬楼梯(动态规划)
  • 数组中两个字符串的最小距离(滑动窗口or贪心+模拟)

数字统计(数学+模拟)

在这里插入图片描述
这个程序的目标是计算在给定区间 [L, R] 内,所有数字中数字 2 出现的次数。下面是逐步分析和注释程序的过程:

解题思路:
输入区间:首先,程序从标准输入中接收两个整数 L 和 R,表示闭区间 [L, R]。
计数器:使用一个 count 变量来累计数字 2 出现的次数。
遍历区间:通过一个 for 循环,从 L 到 R 逐一遍历每一个整数。
逐位检查:对于每一个整数 i,通过一个 while 循环逐位提取其数字(从个位到最高位),检查是否有数字等于 2。
如果找到 2,则计数器 count 增加。
无论是否找到 2,都会通过 num = num / 10 将当前数的最后一位去掉,继续检查剩下的位。(核心)
输出结果:遍历完所有数字后,输出 count,即数字 2 出现的总次数。

#include <iostream>
using namespace std;int main() 
{// 定义L和R,用于存储输入的区间边界int L = 0, R = 0;// 从输入中读取L和R的值,表示遍历的区间 [L, R]cin >> L >> R;// 定义count用于记录数字2出现的总次数int count = 0;// 遍历区间中的每一个数,从L到Rfor(int i = L; i <= R; i++){// num用于逐位检查当前数 iint num = i;// 逐位分解num,检查是否存在数字2while(num){// 如果当前数的个位是2,则计数器增加if(num % 10 == 2){count++;  // 找到一个2,计数器增加}// 去掉num的个位,继续检查下一位num = num / 10;}   }// 输出数字2出现的总次数cout << count << endl;return 0;
}

两个数组的交集(哈希)

在这里插入图片描述
这个程序的目标是找到两个数组 nums1 和 nums2 的交集,即两个数组中共同存在的元素,并返回这些元素组成的结果数组。具体来说,程序利用一个布尔类型的哈希表来跟踪 nums1 中的元素,然后在 nums2 中查找这些元素是否存在。如果存在,则将其加入到结果数组中。

解题思路:
使用哈希表:利用一个布尔类型的数组 hash,来记录 nums1 中每个元素的存在情况。哈希表的大小为 1010,因此它能够记录值在 0 到 1009 范围内的元素。(已经足够大了,观察数据范围)
遍历 nums1:首先遍历 nums1,将 nums1 中出现的每个元素对应的哈希表位置设为 true,表示该元素存在于 nums1 中。
遍历 nums2:然后遍历 nums2,检查当前元素在哈希表中是否标记为 true。如果是,说明该元素既在 nums1 中也在 nums2 中,因此将该元素加入到结果数组中,并将哈希表中对应位置设置为 false,以避免重复添加该元素。
返回结果:最终返回包含交集元素的结果数组。

class Solution 
{// 定义一个大小为1010的布尔数组,用于标记元素是否在nums1中出现bool hash[1010] = { 0 };  // 初始化为全0,表示所有数字初始都没有出现过public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {// 定义一个存放交集结果的数组vector<int> ret;// 遍历nums1,将nums1中出现的元素在hash表中标记为truefor(auto x : nums1){hash[x] = true;  // 在nums1中出现的元素,设置为true}// 遍历nums2,检查nums2中的元素是否在nums1中也存在(通过hash表)for(auto x : nums2){// 如果当前元素x在hash表中为true,说明它在nums1中也存在if(hash[x]){ret.push_back(x);  // 将该元素添加到结果数组中hash[x] = false;   // 防止重复添加,将hash表中对应位置重置为false}}// 返回结果数组ret,包含nums1和nums2的交集return ret;}
};

点击消除(栈)

在这里插入图片描述
这个程序的目标是从输入字符串中删除相邻的重复字符,最终返回处理后的字符串。如果字符串被完全消除,则输出 0。这个任务可以使用一个栈结构来解决,其中每次遇到相同的相邻字符时,就将其删除。

解题思路:
栈的思想:利用一个字符串变量 stack 作为栈,逐一遍历输入字符串 s,将每个字符入栈(即加入到 stack 末尾)。如果遇到的字符与栈顶字符(栈的最后一个字符)相同,则将栈顶字符弹出(删除)。
处理逻辑:
如果当前字符与栈顶字符相同,则消去(从栈中删除栈顶元素)。
如果当前字符与栈顶字符不同,则将该字符添加到栈中。

最终结果:遍历结束后,栈中剩下的字符就是处理后的字符串。如果栈为空,则说明所有字符都被消去,输出 0。否则,输出栈中的字符。

#include <iostream>
#include <string>
using namespace std;int main() 
{// 定义一个字符串s,用于存储输入string s;// 从标准输入读取字符串cin >> s;// 定义一个空字符串stack,模拟栈的作用string stack;  // 栈// 遍历输入字符串中的每一个字符for(auto ch : s){// 如果栈不为空,并且栈顶元素与当前字符相同if(stack.size() && stack.back() == ch){// 栈顶元素与当前字符相同,弹出栈顶元素(即消除这一对相同字符)stack.pop_back();}else {// 栈顶元素与当前字符不同,将当前字符压入栈中stack += ch;}}// 如果栈为空,输出"0",表示所有字符都被消去;否则输出栈中的字符串cout << (0 == stack.size() ? "0" : stack) << endl;return 0;
}

牛牛的快递(模拟)

在这里插入图片描述

#include <iostream>
#include <cmath> // 引入cmath库,用于使用ceil函数
using namespace std;int main() 
{double a = 0; // 定义双精度变量a,用于表示数值输入char b = 0; // 定义字符变量b,用于表示是否有额外费用的标志cin >> a >> b; // 输入变量a和bint ret = 0; // 定义最终费用变量ret,并初始化为0// 根据输入a的值计算基础费用if(a <= 1) // 如果a小于等于1{ret += 20; // 费用为20}else // 如果a大于1{ret += 20; // 首先,前1单位的费用为20a -= 1; // 去掉前1单位的部分ret += ceil(a); // 剩余部分向上取整,每单位加1的费用}// 判断是否需要额外加费if(b == 'y') // 如果b是字符'y'{ret += 5; // 增加额外费用5}cout << ret << endl; // 输出最终计算的费用return 0;
}

最小花费爬楼梯(动态规划)

在这里插入图片描述
解题思路:
这道题目使用动态规划(Dynamic Programming)来解决楼梯问题,目的是计算从起点到达楼梯顶端(第 n 步)的最小花费。具体解题步骤如下:

定义输入:
需要爬的楼梯步数为 n。
输入每一步对应的花费,存储在 cost 数组中,其中 cost[i] 表示到达第 i 步所需的花费。

状态定义:
dp[i] 表示到达第 i 步的最小花费。通过递推计算得到,使用动态规划来避免重复计算。

状态转移方程:
要到达第 i 步,有两种选择:
从第 i-1 步到达第 i 步,花费为 dp[i-1] + cost[i-1]。
从第 i-2 步跳到第 i 步,花费为 dp[i-2] + cost[i-2]。
我们取这两者中的最小值作为 dp[i],即:
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

初始条件:
dp[0] = 0 和 dp[1] = 0。即在没有走楼梯前不需要花费,开始爬楼梯的第一步可以从地面直接跳到第 1 或第 2 步。

最终输出:
输出 dp[n],即到达第 n 步的最小花费。

#include <iostream>
#include <vector>
using namespace std;int main()
{int n = 0; // 定义n,表示楼梯的阶数(或需要计算的步骤数)cin >> n; // 输入n的值vector<int> cost(n + 1); // 定义一个大小为n+1的向量,用于存储每一步的花费vector<int> dp(n + 1); // 定义一个dp向量,用于存储到达每一步的最小花费// 输入每一步的花费for(int i = 0; i <= n; i++) {cin >> cost[i];}// 动态规划求解最小花费for(int i = 2; i <= n; i++){dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); // 到达第i步的最小花费是:// 要么从i-1步到i,花费dp[i-1] + cost[i-1]// 要么从i-2步跳到i,花费dp[i-2] + cost[i-2]// 取其中较小的值作为dp[i]的值}// 输出到达第n步的最小花费cout << dp[n] << endl;return 0;
}

数组中两个字符串的最小距离(滑动窗口or贪心+模拟)

解题思路:
这道题的目的是根据输入的两个变量计算最终的费用。一个变量是数值 a,另一个是标志位 b。根据不同的情况,费用的计算方式也不同,具体思路如下:

输入解析:
a 表示某个数值(例如距离、时间等),这是需要计算费用的基础数据。
b 是一个字符标志,表示是否有额外费用。当 b 为 ‘y’ 时,需要在基础费用上额外加收 5 元。

费用计算规则:

当 a <= 1 时,直接收取固定费用 20 元。
当 a > 1 时,费用的计算分为两部分:
第一单位的费用固定为 20 元。
从第 2 单位开始,按每个单位 1 元的费用计算,但需要对剩余部分向上取整,也就是通过 ceil 函数来确保任何非整数的部分都按整单位计算。

额外费用:
如果 b == ‘y’,则需要额外收取 5 元作为附加费用。
最终输出:

通过以上的规则,累加计算得到总费用,并输出结果。

#include <iostream>
#include <vector>
#include <string>
#include <cmath> // 为了使用abs函数
using namespace std;int findMinDistance(const vector<string>& strs, const string& str1, const string& str2) {int n = strs.size();int pos1 = -1, pos2 = -1;int minDistance = n + 1; // 初始化为比数组长度大的值// 遍历数组for (int i = 0; i < n; ++i) {if (strs[i] == str1) {pos1 = i;}if (strs[i] == str2) {pos2 = i;}// 如果两个字符串都出现过,更新最小距离if (pos1 != -1 && pos2 != -1) {minDistance = min(minDistance, abs(pos1 - pos2));}}// 如果两者都没有找到,返回-1if (pos1 == -1 || pos2 == -1) {return -1;}return minDistance;
}int main() {int n;cin >> n; // 输入数组长度string str1, str2;cin >> str1 >> str2; // 输入str1和str2vector<string> strs(n); // 定义字符串数组for (int i = 0; i < n; ++i) {cin >> strs[i]; // 输入每个字符串}int result = findMinDistance(strs, str1, str2);cout << result << endl; // 输出结果return 0;
}

首先,遍历字符串序列,逐个检查当前字符串是否是 s1 或 s2。如果遇到 s1,则向前找最近一次 s2 出现的位置,计算距离并更新最短距离。同理,遇到 s2 时向前找最近一次 s1 出现的位置,更新最短距离。
通过这种双指针的方式,在一次遍历中就能解决问题,时间复杂度为 O(n),非常高效。

#include <iostream>
#include <string>
using namespace std;int main()
{int n;          // 字符串序列的长度string s1, s2;  // 目标字符串 s1 和 s2string s;       // 当前输入的字符串cin >> n;       // 输入字符串数量cin >> s1 >> s2; // 输入目标字符串 s1 和 s2int prev1 = -1, prev2 = -1;  // 记录上一次 s1 和 s2 出现的位置,初始值为 -1 表示还没有出现int ret = 0x3f3f3f3f;        // 初始化最小距离为一个非常大的值// 遍历字符串序列for (int i = 0; i < n; i++){cin >> s;  // 输入当前字符串// 如果当前字符串是 s1,尝试向前找最近的 s2if (s == s1) {if (prev2 != -1) // 确保之前有出现过 s2{ret = min(ret, i - prev2);  // 更新最小距离}prev1 = i;  // 更新 s1 的位置}// 如果当前字符串是 s2,尝试向前找最近的 s1else if (s == s2) {if (prev1 != -1) // 确保之前有出现过 s1{ret = min(ret, i - prev1);  // 更新最小距离}prev2 = i;  // 更新 s2 的位置}}// 判断是否找到了合法的最短距离if (ret == 0x3f3f3f3f) cout << -1 << endl;  // 如果没有找到,则输出 -1else cout << ret << endl;  // 否则输出最短距离return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放式蓝牙耳机排行榜第一名是哪款?推荐五款热门开放式耳机!

​在当今的耳机市场上&#xff0c;开放式耳机因其时尚的外观和舒适的佩戴体验&#xff0c;已经成为广受欢迎的日常选择。然而&#xff0c;面对众多品牌和参差不齐的质量&#xff0c;选择一款合适的开放式耳机确实让人头疼。作为一名拥有三年耳机评测经验的博主&#xff0c;同时…

238.除自身以外数组的乘积

目录 题目解法思路&#xff1a;步骤&#xff1a;代码实现&#xff1a;解释&#xff1a;示例&#xff1a;输出&#xff1a; 除nums[i]之外的其他数如何快速找到其索引&#xff0c;不用遍历的方法&#xff1f;前缀积是什么&#xff1f;为什么会想到前缀积和后缀积的方法&#xff…

ssm医院交互系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容

不坑提词器&#xff0c;全称&#xff1a;不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求&#xff1a;Win10 1024 以上&#xff08;特别提醒&#xff1a;Win7状态下不可隐身&#xff09; ⏬下载 提词器默认放在不坑盒子的安装目录下&…

MySQL—事务

目录 1.事务的简介&#xff1a; 2.使用事务 2.1 开启事务 2.2 自动提交 2.3 使用范围 2.4 事务的属性 1.事务的简介&#xff1a; 介绍事务之前&#xff0c;我们先来看一个经典的场景&#xff1a;银行转账。 假如a想要把自己的账户上的10万块钱转到b账户上&#xff0c;这…

实现uniapp天地图边界范围覆盖

前言&#xff1a; 在uniapp中&#xff0c;难免会遇到使用地图展示的功能&#xff0c;但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的&#xff0c;所以天地图则是最佳选择。 此篇文章&#xff0c;详细的实现地图展示功能&#xff0c;并且可以自定义容器宽…

Win10、Win11一段时间不操作电脑,屏幕点击无反应假死,粘贴失效,任务栏失效等解决方法

网上找到的方法基本都是说在任务管理器中找到资源管理器的进程进行重启即可&#xff0c;这样确实能解决燃眉之急&#xff0c;可是这个问题还是会反反复复出现&#xff0c;无法根治。 本人测试了多种方案后&#xff0c;最终发现设置电源选项的硬盘关闭时间可以根治此问题。 设置…

Scala的内部类

Scala中的内部类&#xff08;Inner Class&#xff09;是指定义在另一个类的内部的类。 内部类可以访问外部类的成员&#xff08;包括私有成员&#xff09;&#xff0c;并且可以与外部类的实例紧密地绑定在一起。 内部类在Scala中非常有用&#xff0c;尤其是在需要封装特定功能…

企业一级流程架构规划方法

在之前关于企业业务流程规划的系列文章中&#xff0c;我们已经分别对企业业务流程规划的价值和原则、企业的业务流程架构的应用、两种常见的企业总体业务流程架构模式等进行了比较深入的分析和阐述&#xff0c;相信大多数企业同仁&#xff0c;已经对企业的业务流程规划&#xf…

【原创】java+springboot+mysql在线文件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…

【Linux系统编程】第三十四弹---使用匿名管道构建简易Linux进程池

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、引言 2、进程池的基本概念 3、管道在进程池中的应用 4、进程池的实现 4.1、master类定义 4.2、测试信道 4.3、通过cha…

一文读懂JPA及Mybatis的原理和机制(面试经)

导览 前言Q&#xff1a;什么是JPA1. 简介2. 原理 Q&#xff1a;JPA持久化框架—Mybatis1. 内部组成与关系2. 各组件作用域和生命周期3. 动态SQL3.1 if语句3.2 choose-when-otherwise 4. mapper映射XML4.1 select4.2 insert 5. $与#的区别5.1 #{...}5.2 ${...} 结语精彩回顾 前言…

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类&#xff0c;因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口&#xff0c;又可以作为组件&#xff08;子窗口&#xff09;。 通过构造函数可以创建以上两种形态的QWidget&#xff1a; // 参数1&#xff1a;使…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图 视图的定义视图的作用视图的注意事项 在MySQL数据库中&#xff0c;视图&#xff08;View&#xff09;是一种非常强大且灵活的工具&#xff0c;它为用户提供了以更安全、更清晰的方式查看和管理数据的途径。 视图的…