当前位置: 首页 > news >正文

笔试练习day17

目录

  • 小乐乐改数字
    • 题目解析
      • 代码
        • 代码解析
  • 十字爆破
    • 题目解析
      • 代码
        • 代码解析
  • 比那名居的桃子
    • 题目解析
      • 代码
        • 代码解析

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题
😎😎😎 实习日记
🐯🐯🐯 Git

小乐乐改数字

小乐乐改数字题目链接
在这里插入图片描述

题目解析

我还是太菜了,这题那么简单都做了很久
这道题很好理解其实就是判断这个输入的数他的每位数是奇数还是偶数,如果是奇数就变成1,偶数就变成0
一开始我想的是用vector去存储修改后的值,然后再输出出来,这个方法是可行的,但是我可能还是不熟练,经常出现越界的情况,因为vector有push_back和insert函数,push_back的话是尾插,到时候输出的时候要从后往前输出,而insert是指定位置插入,我是用的前插,这个时间复杂度就有点高了,虽然可以节省写代码的时间,但是还是尽量别这样写

后面我又尝试了用string写,string因为是一个字符串,我们要将字符串的每个字符给他转变成数字,其实就是字符-‘0’,然后判断是否为奇数还是偶数,修改的话我们可以直接在字符串上面修改,或者再创建一个string的s2每次判断完后就让s2+=也行

后面就是要判断只有一个数字的情况,比如我们输入的是2,最后要输出0,以及判断结果是否有前置0的情况,比如输入的是2222221,那么输出的是1,而不是000000,我们需要将前置0都跳过,输出后面的有效数字

代码

#include <iostream>
#include<string>
using namespace std;int main() {string s1, s2;cin >> s1;int size = s1.size();for (int i = 0; i < size; i++) {if ((s1[i] - '0') % 2 == 0) s2 += '0';else s2 += '1';}int count = 0;while (count < size && s2[count] == '0') count++;if (count == size) cout << 0;else cout << s2.substr(count) << endl;return 0;
}
代码解析

for (int i = 0; i < size; i++) 这个就是去遍历这个字符串
if ((s1[i] - ‘0’) % 2 == 0) s2 += '0’是判断奇数和偶数,然后将判断后的结果保存到s2当中
while (count < size && s2[count] == ‘0’) count++ 这里的count是为了跳过前置0的情况,当count<size时说明没有越界,如果s2[count]为0,那么就让count++去跳过这个0
if (count == size) cout << 0 如果count=size那么就说明这个s2全都是0,我们就输出0
否则我们就将从count位置开始输出后面的所以数字

十字爆破

十字爆破题目链接
在这里插入图片描述

题目解析

这道题题目理解很简单,就是求行和列相加的结果,然后以一定的格式输出就行了,只不过这里要注意数组越界的情况,这里最好用动态数组去做,因为如果是静态的话会因为太大了导致过不了,另外vector的二维数组我不知道怎么创建,所以这道题我就没做出了

代码

#include<iostream>
#include<vector>
using namespace std;int n,m;
int main()
{cin>>n>>m;vector<vector<long long>> arr(n,vector<long long>(m));vector<long long>n1(n,0),m1(m,0);for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%lld",&arr[i][j]);n1[i]+=arr[i][j];m1[j]+=arr[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++)printf("%lld ",n1[i]+m1[j]-arr[i][j]);cout<<endl;}return 0;
}
代码解析

vector<vector> arr(n,vector(m)) 这里的vector<vector> 表示的就是一个二维数组
arr(n,vector(m))则是二维动态数组的初始化方式,n表示的是行数,vector(m)则表示的是创建出一个长度为m的一维数组

vectorn1(n,0),m1(m,0)则是创建出长度为n和m的数组并初始化为0
因为是long long类型的,所以输出的格式要注意,此外这里我用的是scanf和printf,没有用cin和cout,这是因为题目建议我们这样去做,并且我之前有了解过cin和cout可能没有scanf和printf快,有些题目可能只需要将cin和cout换成scanf和printf的话可能就过了
在这里插入图片描述
下面是我之前没有用动态数组做的代码,这里就是因为题目要求的是n*m<=1000000,当时我将n和m的长度都定义成1000000,结果一个都过不了,后面给他改小了才过了一部分,但是因为n和m可能会出现n=1000000,而m=1的情况,所以下面这个代码是会出现越界的

#include<iostream>
using namespace std;int n,m;
long long arr[1000][1000]={0};
long long n1[1000]={0};
long long m1[1000]={0};
int main()
{cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%lld",&arr[i][j]);n1[i]+=arr[i][j];m1[j]+=arr[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++)printf("%lld ",n1[i]+m1[j]-arr[i][j]);cout<<endl;}return 0;}

在这里插入图片描述
在这里插入图片描述

比那名居的桃子

比那名居的桃子题目链接
在这里插入图片描述

题目解析

这道题我的想法是用滑动窗口去做,因为我们可以从题目中知道桃子有持续效果,我们通过滑动窗口可以求出任何时候吃下桃子的快乐值以及羞耻度总和

这道题有三种解法
第一种是用暴力解法
这种解法就是用两次for循环,定义 i 和 j ,i 表示当天吃下桃子,j 就去遍历求出在吃后的k天里快乐值以及羞耻度的大小
在这里插入图片描述

但是因为这里题目的数据n和k的最大值是10^5,如果用暴力解法的话会超时
所以用第二种解法,就是滑动窗口,从上题中我们可以看出在 j 移动的时候,如下图
在这里插入图片描述
上图中我们其实以及知道在当天吃下桃子后快乐值和羞耻度的大小,当 i 往后走一步的时候, j 其实是没有必要再重新从 i 的位置开始算的
在这里插入图片描述
我们只需要计算他们之间的差值,如下图
在这里插入图片描述
在i往后走一步后,他的快乐值变化为9-1,而羞耻度变化值为7-5
因为在i还没往后走的时候我们是计算出了快乐值以及羞耻度的,所以只需要加上这个差值就可以了

第三种解法名字叫前缀和
我们可以不用两个变量 i 和 j 去表示,因为 j 和 i 之间是有关系的,j=i+k-1
在这里插入图片描述
我们可以用一个sum的数组去记录前缀和,如下图
在这里插入图片描述
sum[i]表示i位置之前的前缀和(黑色方块),sum[i+k-1]表示i+k-1位置前的前缀和(红色方框)
最后我们只需要用sum[i+k-1]-sum[i]就能得出结果

代码

这里我们用滑动窗口区做

#include<iostream>
using namespace std;
typedef long long LL;
LL n,k;
const int N=1e5+10;
LL h[N],s[N];
int main()
{cin>>n>>k;for(LL i=1;i<=n;i++)cin>>h[i];for(LL i=1;i<=n;i++)cin>>s[i];LL left=0,right=0;LL hSum=0,sSum=0,hMax=0,sMin=0,begin=0;while(right<=n){hSum+=h[right];sSum+=s[right];while(right-left+1>k){hSum-=h[left];sSum-=s[left];left++;}if(right-left+1==k){if(hSum>hMax){begin=left;hMax=hSum;sMin=sSum;}else if(hSum==hMax&&sSum<sMin){begin=left;hMax=hSum;sMin=sSum;}}right++;}cout<<begin<<endl;return 0;
}
代码解析

LL left=0,right=0中left表示的就是上图中左边的i,right表示的就是上图中右边的j,也就是i+k-1
LL hSum=0,sSum=0,hMax=0,sMin=0,begin=0中hSum表示的是快乐值的总和,sSum表示的是羞耻度的总和,hMax就是最大的快乐值,sMin则是最小的羞耻度
因为right是最右边的位置,他不可能超过n,所以while条件的循环是right<=n(注意之前输入数据的时候是从i=1开始输入的,也就是说下标表示的就是天数)

在循环中一直让hSum+=h[right] sSum+=s[right] 当right-left+1==k的时候就说明了我们以及计算出从left天吃下桃子后的快乐值总和以及羞耻度总和
这时我们需要比较如果hSum>hMax,那么就让hMax和sMin更新
如果hSum=hMax,那么就比较sSum和sMin,每次循环完后就让right++,这样就会让right-left+1>k,此时就需要更新
hSum-=h[left] sSum-=s[left] left++

相关文章:

  • C# 经纬度坐标的精度及WGS84(谷歌)、GCJ02(高德)、BD09(百度)坐标相互转换(含高精度转换)
  • Java 如何处理UnresolvedAddressException异常
  • 虚拟机中安装欧拉系统(EulerOS)后如何正确设置IP地址
  • Android studio配置Flutter遇到的问题总结
  • 数据结构入门:线性表(Day 1)——从原理到代码实战
  • STL c++ 详解——stack与queue模拟实现与deque的介绍
  • 【Sequelize】
  • 地理人工智能中位置编码的综述:方法与应用
  • VMware下Ubuntu空间扩容
  • 开展东南亚货运专线业务,有哪家系统提高管理效率?
  • flutter json解析增强
  • Android 9.0系统源码定制:实现开机启动特定App的全面指南
  • 《分布式软总线:不同频段Wi-Fi环境下设备发现兼容性难题》
  • leetcode面试经典算法题——2
  • 微店商品详情API接口:功能解析与数据应用实践
  • LLM-as-Judge真的更偏好AI输出?
  • 鸿蒙应用元服务开发-Account Kit配置登录权限
  • Prometheus架构组件
  • 国内开源医疗模型研究报告
  • 自动化测试工具playwright中文文档-------14.Chrome 插件
  • 中国工程院院士、歼八Ⅱ飞机系统工程副总设计师温俊峰逝世
  • 美联储褐皮书:关税政策背景下,美国部分地区物价上涨、经济前景恶化
  • “全国十大考古”揭晓:盘龙城遗址、周原遗址入围
  • 人民日报:外资车企携新车、前沿技术亮相上海车展,坚定信心深耕中国市场
  • 厦门国贸去年营收约3544亿元,净利润同比减少67.3%
  • 央行研究局局长答澎湃:持续优化跨境金融服务政策工具箱,有效支持企业走出去