【C++】 —— 笔试刷题day_17

【C++】 —— 笔试刷题day_17

一、小乐乐改数字

题目解析

在这里插入图片描述
这道题,它们给定一个数,我们要对它进行修改;如果某一位是奇数,就把它变成1,;如果是偶数,就把它变成0;

让我们输出最后得到的数。

算法思路

这道题,总体来说是非常简单的啦,解法呢,就是模拟整个过程。

当然呢这里模拟,也不是去一次去这个数的某一位去操作,那太麻烦了。

我们可以直接按照字符串进行输出,然后遍历字符串,判断这一个数是奇数还是偶数,然后进行操作。

这里我们通过查看ASSIC码可以发现,字符09数字0到9它的奇偶性是一样的,所以我们进行判断时就不用去-'0'

最后呢我们需要取出前缀0,这里可以使用stoi函数,也可以自己实现去除前缀0

在这里插入图片描述

代码实现

#include<iostream>#include<string>usingnamespace std; string str;intmain(){ cin >> str;for(int i =0; i < str.size(); i++){if(str[i]%2==0) str[i]='0';else str[i]='1';} cout <<stoi(str)<< endl;return0;}

二、十字爆破

题目解析

在这里插入图片描述
OK啊,这道题输入一个n*m的二维数组,让我们求它每一个位置方格的得分情况,最后输出。

得分规则:arr[i][j]位置的得分等于第i行和第j列所有数的和。

算法思路

题目描述很简单,现在我们来看如何去解决这道问题;

首先暴力解法,当我们求某一个位置的得分时,去遍历它这一行和这一列所有的数,然后求和。(这里肯定会超时)

暴力解法不行,那我们来想一想有没有什么可以优化的:

我们在求(i,j)位置时,要用到第i行所有数的和;在求(i,j-1)位置时,也要用到第i行所有数的和;

那我们是不是可以预先将每一行/每一列所有数的和求出来,这样我们在求某一个位置的得分时就不用去遍历了。

**OK啊,这里我们的思路就出来了:**就是先将每一行/每一列所有数的和求出来,然后求(i,j)位置的和直接用第i行的和加上第j列的和,再减去i,j位置的数就可以了。(这里第i行会计算一遍(i,j)位置,第j列也会计算(i,j)位置,所有要减去一个(i,j)位置的值)。

代码实现

#include<iostream>usingnamespace std;constint N =1e6+10;int n,m;longlong row[N];longlong col[N];intmain(){scanf("%ld %ld",&n,&m);longlong arr[n][m];for(int i =0;i < n;i++){for(int j =0;j < m;j++){scanf("%ld",&arr[i][j]); row[i]+=arr[i][j]; col[j]+=arr[i][j];}}//记录完成以后输出for(int i =0;i<n;i++){for(int j =0;j<m;j++){printf("%ld ",row[i]+col[j]- arr[i][j]);}printf("\n");}return0;}

三、比那名居的桃子

题目解析

在这里插入图片描述
题目描述:小红想要吃桃子,吃完桃子以后每天可以获得ai的快乐值,获得bi个羞耻值,桃子效果可以持续k天。

现在我们要求,小红在哪一天吃桃子可以获得尽可能多的快乐值;(如果快乐值相等,就让羞耻值尽可能小)。

算法思路

对于这道题,我们可以使用暴力解法,遍历数组,遍历到i位置时,求一下从i位置开始k天的快乐值和羞耻值。

对于暴力解法,我们就要进行优化:

滑动窗口:

我们在求从i位置开始和从i+1位置开始时,这两个区间的差别就是i位置和i+k位置;

所以我们在处理求i+1位置开始时,只需要让i位置开始求出的值减去i位置,加上i+k位置即可。

这里我们需要记录区间内快乐值的和hSum,也要记录区间内羞耻值的和sSum;还要记录一下当前快乐值的最大值hMax和当前羞耻值的最小值sMin入窗口:hSum加上right位置的快乐值,sSum加上right位置的羞耻值。判断: 当区间的长度大于k时,进行出窗口操作(进行一次即可,这里我们要维持区间长度为k出窗口:hSum减去left位置的快乐值,sSum减去left位置的羞耻值;left++即可。更新结果:,当区间长度等于k时,进行更新结果操作,这里我们更新不止是hSum > hMax时进行更新,当hSum == hMax && sSum < sMin时,我们也要更新结果。

当然对于这道题,我们还可以使用前缀和来解决:

通过暴力解法和优化的滑动窗口,我们可能发现,我们需要从i位置开始,k个数据的和;

那我们能不能先求出来这个和呢?

我们对于hs数组,分别创建一个对应的hSumsSum数组,这两个数组中存放的就是每一个位置之前所有数的和。

hSum[i]i位置之前h中所有数的和;

sSum[i]i位置之前s中所有数的和;

这里我们在遍历i位置时,我们可以直接拿到从i位置开始k个数据的和numhnumh = hSum[i+k-1] - hSum[i-1])和numsnums = sSum[i+k-1] - sSum[i-1])。

这样我们遍历是时候,取到numhnums然后判断更新结果就好了。

这需要注意,我们在遍历i位置时,需要用到i-1位置和i+k-1位置,所以我们从1开始遍历,直到n-k[1 , n-k+1])

这样对于大于n-k+1小于等于n的位置的数据,从这些位置开始,后面是没有k个数据的。

在这里插入图片描述

代码实现

滑动窗口:

#include<iostream>usingnamespace std;constint N =1e5+10;longlong n,k;longlong h[N+1],s[N+1];longlong hSum[N+1],sSum[N+1];intmain(){//滑动窗口 cin>>n>>k;for(int i =1;i<=n;i++) cin>>h[i];for(int i =1;i<=n;i++) cin>>s[i];int left =1, right =1;longlong hSum =0,sSum =0, hMax =0, sMin =0;int ret =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)||(hSum == hMax && sSum < sMin)){ ret = left; hMax = hSum; sMin = sSum;}} right++;} cout<<ret<<endl;return0;}

前缀和:

#include<iostream>usingnamespace std;constint N =1e5+10;longlong n,k;longlong h[N+1],s[N+1];longlong hSum[N+1],sSum[N+1];intmain(){//前缀和 cin>>n>>k;for(int i =1;i<=n;i++){ cin>>h[i]; hSum[i]= hSum[i-1]+h[i];}for(int i=1;i<=n;i++){ cin>>s[i]; sSum[i]= sSum[i-1]+s[i];}int ret =0;longlong hMax =0, sMin =0;for(int i =1;i<=n-k+1;i++){longlong numh = hSum[i+k-1]- hSum[i-1];longlong nums = sSum[i+k-1]- sSum[i-1];if((numh > hMax)||(numh == hMax && nums < sMin)){ ret = i; hMax = numh; sMin = nums;}} cout<<ret<<endl;return0;}

到这里本篇文章就结束了,继续加油

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

Read more

HarmonyOS 网络请求与数据持久化

HarmonyOS 网络请求与数据持久化

网罗开发(小红书、快手、视频号同名) 大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。 图书作者:《ESP32-C3 物联网工程开发实战》 图书作者:《SwiftUI 入门,进阶与实战》 超级个体:COC上海社区主理人 特约讲师:大学讲师,谷歌亚马逊分享嘉宾 科技博主:华为HDE/HDG 我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

By Ne0inhk
Flutter 三方库 metalink_advanced_final 的鸿蒙化适配指南 - 在 OpenHarmony 打造极致、安全的 P2P 下载与资源分发底座

Flutter 三方库 metalink_advanced_final 的鸿蒙化适配指南 - 在 OpenHarmony 打造极致、安全的 P2P 下载与资源分发底座

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 metalink_advanced_final 的鸿蒙化适配指南 - 在 OpenHarmony 打造极致、安全的 P2P 下载与资源分发底座 在大数据传输、大型游戏资源更新以及分布式固件升级场景中,传统的单点 HTTP 下载往往面临带宽压力和校验失效的风险。metalink 协议(RFC 5854)通过整合多个源地址与强校验机制,提供了一套工业级的资源分发方案。metalink_advanced_final 库为 Flutter 开发者提供了该协议的终极解析与执行引擎。本文将深度解析如何在 OpenHarmony(鸿蒙)环境下,结合鸿蒙的并发架构,完美适配这一强大的下载工具。 前言 随着鸿蒙系统(HarmonyOS)跨终端特性的普及,应用在不同设备间流转时的资源同步速度成为了用户体验的“胜负手”。metalink_advanced_final

By Ne0inhk
Flutter for OpenHarmony 实战之基础组件:第五十七篇 Scrollbar — 完美适配鸿蒙系统的滚动指示器

Flutter for OpenHarmony 实战之基础组件:第五十七篇 Scrollbar — 完美适配鸿蒙系统的滚动指示器

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter for OpenHarmony 实战之基础组件:第五十七篇 Scrollbar — 完美适配鸿蒙系统的滚动指示器 前言 在长文本阅读、庞大的列表或是复杂的表格展示中,用户往往需要明确知道当前处于文档的什么位置。一个设计精美、响应灵敏的滚动条(Scrollbar)不仅能提供视觉上的定位反馈,还能大幅提升用户在大量数据间的穿梭效率。 在 Flutter for OpenHarmony 开发中,默认的滚动条虽然可用,但要打造符合鸿蒙系统(HarmonyOS)侧边纤细、拖拽感强的视觉体验,我们需要深度定制 Scrollbar 和 RawScrollbar。本文将详解如何通过配置和自定义,实现一个极具“鸿蒙感”的交互滚动条。 一、Scrollbar 的三种呈现方式 1.1 自动消失模式(默认) 仅在用户滚动时显示,停下几秒后自动淡出。 Scrollbar( child:

By Ne0inhk
Flutter 三方库 flat 多维深度树形降维打击鸿蒙平台双向互转适配研究:极限穿透高层嵌套复杂模型反序列化层级并强力规避节点栈堆积泄漏风险提升分布式传输-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 flat 多维深度树形降维打击鸿蒙平台双向互转适配研究:极限穿透高层嵌套复杂模型反序列化层级并强力规避节点栈堆积泄漏风险提升分布式传输-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flat 多维深度树形降维打击鸿蒙平台双向互转适配研究:极限穿透高层嵌套复杂模型反序列化层级并强力规避节点栈堆积泄漏风险提升分布式传输极高效率 前言 在 OpenHarmony 分布式业务开发中,不同端侧(如手机、平板、IoT 设备)之间交换的 JSON 数据往往具有深层的嵌套结构。这些结构对于开发者虽然逻辑清晰,但在进行快速映射、数据库存储或特定列表渲染时,多层 map['a']['b']['c'] 的写法不仅繁琐且极易引发空指针异常。flat 库提供了一种极致简约的方案,能将嵌套 JSON 瞬间“拍扁”为单层 Map,或根据 Key 的路径重新构建嵌套。本文将介绍其在鸿蒙端的应用实战。 一、

By Ne0inhk