【软件特战队2023.2.20笔试题】 最小缩进操作次数

  • 题目描述
  • 解题思路
  • 伪代码
  • 完整代码
  • 结尾

朋友分享给我的,简单记录下

题目描述

请实现一个简单的代码缩进功能,把一段未缩进的代码,通过多次操作,最终实现每一行的缩进长度要求。

一次操作是指:
一次操作时缩进一个TAB长度
一次操作可以选择一行或者连续多行同时缩进。

给出的要缩进的代码长度用一个数组表示,要求计算出最少需要操作多少次。

输入描述:
一个整数n。表示代码总行数,取值范围【1,65535】
接下来一行有n个整数,依次表示第1~n行的最终缩进长度要求,取值范围:[0,1000000]。

示例1:
输入:
5
1 2 3 2 1
输出:
3
说明:最少需要操作三次,第1次操作全选所有行,缩进1个TAB;第二次操作选择2,3,4行,再缩进1个TAB;第三次才做选择第3行,再缩进1个TAB。

示例2:
输入:
9
0 1 2 0 2 4 2 1 0
输出:
6
说明:
第一次缩进后:0 0 1 0 2 4 2 1 0
第二次缩进后:0 0 0 0 2 4 2 1 0
第三次缩进后:0 0 0 0 1 3 1 0 0
第四次缩进后:0 0 0 0 0 2 0 0 0
第五次缩进后:0 0 0 0 0 1 0 0 0
第六次缩进后:0 0 0 0 0 0 0 0 0

解题思路

我们最终的目标是将一个连续数组的所有值通过操作都变成0,我们需要记录达到这个目标所用的最小的操作次数。
那么如何操作用的次数最少呢?我们采用以下策略:

  1. 对于连续的子数组,就对这里连续的数组所有的成员都执行一次缩进操作(即数值-1)。
  2. 对于不连续的数组,也就是单个的一个数据(以a[i]为例),就只能对a[i]执行a[i]次缩进,将它变成0。
    根据以上思路,我们的代码思路就是:
      1.寻找给出的数组的第一连续子数组:然后对这个这个子数组缩进x次(x表示这个连续数组中的所有成员的最小值),并记录操作的次数。
      2.重复上述操作,知道找不到任何一个连续子数组(也就表示着数组中所有成员的值都为0)。此时返回最小操作次数即可。

伪代码

int calMinTab(vector<int> tabVec, int nums) {int start = 0, end = 0;while (true) {//寻找第一个连续子数组,并记录begin和end,以及连续数组的最小值(minTab)if (findFirstContinusVec(tabVec, begin, end, minTab)) {//记录对此连续数组的操作次数rst = rst + minTab;//对所有数组中的值都减去操作的次数(模仿真正缩进操作)doTab(tabVec, beign, end);//如果找不到任何数组,说明数组为0了,退出循环。} else break;}return rst;
}

完整代码

#include <iostream>
#include <vector>
using namespace std;
class Solution {public:vector<int> tabVec;int callMinTab() {if (tabVec.size() == 0) return 0;while (true) {//找到数组中第一个连续的数组if (findFirstContinusVec(tabVec)) {//找到了数组中第一个连续的数组//rst加上该连续数组中的最小值,rst += minNums;//对这个连续数组中的每个元素减去该最小值doTab(tabVec);}else return rst;}return rst;}void doTab(vector<int> &tabVec) {for (int i = begin; i <= end; i++) {tabVec[i] = tabVec[i] - minNums;}}//找到数组中第一个连续的数组,并且找到这个连续数组中的最小值minNums,开始位置begin,结束位置beginbool findFirstContinusVec(vector<int> tabVec) {//是否找到连续数组的第一个非零值bool ifFisrtNumsFind = false;int i = 0;for(;i< tabVec.size();i++) {//当找到连续数组的第一个非零值时if (ifFisrtNumsFind == true) {if (tabVec[i] == 0) {//找到连续数组的最后一个非零值end = i - 1;return true;} else {//更新最小值if (tabVec[i] < minNums) minNums = tabVec[i];}}//当没有找到连续数组的第一个非零值时else if (ifFisrtNumsFind == false && tabVec[i] != 0) {//找到连续数组的第一个非零值minNums = tabVec[i];begin = i;ifFisrtNumsFind = true;} } if (ifFisrtNumsFind && i == tabVec.size()) {end = i -1;return true;}//没有找到任何连续数组,那么返回Falsereturn false;
}private:int rst = 0;int minNums = INT_MAX;int begin = 0;int end = 0;
};int main()
{int num, n;Solution t;while (cin >> num){while (num--){cin >> n;t.tabVec.push_back(n);}return t.callMinTab();}
}

结尾

本系列的所有题目都是面试实习群里的群友们面试完反馈的,想要加群一起交流分享新鲜的互联网面试经验的同学,请关注我的微信公众号:"奔跑的鲁班七号”,回复:“面试学习交流群” 获得群二维码,入群学习分享即可

【华为软件特战队2023.2.20笔试题】 最小缩进操作次数相关推荐

  1. 校招c语言笔试题数组,华为校园招聘考试C语言C笔试题

    华为校园招聘考试C语言C笔试题 华为校园招聘考试C语言C++笔试题 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2)在模块 ...

  2. 互联网公司招聘--华为--校园招聘程序员--2017年笔试题

    互联网公司招聘–华为–校园招聘程序员–2017年笔试题 互联网公司招聘–华为–校园招聘程序员–2017年笔试题 互联网公司招聘–华为–校园招聘程序员–2017年笔试题

  3. 互联网公司招聘--华为--校园招聘程序员--2015年笔试题

    互联网公司招聘–华为–校园招聘程序员–2015年笔试题 互联网公司招聘–华为–校园招聘程序员–2015年笔试题 互联网公司招聘–华为–校园招聘程序员–2015年笔试题

  4. 【Interview###】华为、中兴嵌入式(C)笔试题

    [程序员面试宝典] 1 读程序段,回答问题 (a)  int main(int argc,char *argv[]) { int c=9,d=0; c=c++%5; d=c; printf(" ...

  5. 华为软件测试面试题 | 一位华为入职成功者的分享【笔试题】

    B站软件测试面试题及面试技巧和简历辅导地址:B站最牛软件测试简历编写和软件测试简历模板以及面试技巧(结尾有惊喜) 一.判断题 1.软件测试的目的是尽可能多的找出软件的缺陷.() 2.Beta 测试是验 ...

  6. 华为海思 2021数字芯片/IC 笔试题+解析

    题目来源于众多网友对笔试的记录.回忆. 理解不到位,难免出错,解析仅为个人看法,有不同意见请留言指教,谢谢! 题型: 30个单选+10个多选 单选 1.影响芯片成本的主要因素是die size和封装, ...

  7. 后端工程师-软件类OPPO-2023届校园招聘笔试题-后端(A卷)

    编程题1 AC import java.util.Arrays;public class Solution {/*** 代码中的类名.方法名.参数名已经指定,请勿修改,直接返回方法规定的值即可*** ...

  8. 2023春实习笔试题记录

    文章目录 美团 3.25 1 模拟栈 2 最大美味值 I 3 每个背包最多装巧克力个数 4 类 Redis 实现 5 最大美味值 II 美团 4.1 1 计算练习 18/100 2 最小差距和 100 ...

  9. 【100%通过率】华为OD机试真题 JavaScript 实现【最小调整顺序次数】【2023 Q1 | 100分】

             所有题目均有五种语言实现.C实现目录.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录

最新文章

  1. python财务-财务方面的学生如何学习python?
  2. TSP问题遗传算法通用Matlab程序
  3. 前端学习(3258):js高级教程(2)
  4. 计算机专业sci二区论文难吗,通信专业二区sci难吗
  5. 【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治
  6. 移动硬盘无法访问,要怎么找到文件
  7. 我是一个*** (十三)
  8. r语言plotmds_多元统计分析R语言建模| 11 多维标度法MDS
  9. html基础知识补全
  10. jenkins 构建异常_Jenkins多环境持续集成架构实践!
  11. 把Word文件变成JPG图片?(转)
  12. 重走长征路---OI每周刷题记录——hzwer
  13. Manjaro学习笔记
  14. 古筝d调变降e调怎么办_古筝各个调式转调详细解读
  15. 云场景实践研究第62期:华栖云
  16. 动画和漫画里ed、op、OVA、ost、bl、gl是什么意思?
  17. [工具使用]SqlMap
  18. ubuntu Failed building wheel for lzf ...gcc...
  19. 微信号,公众平台账号,开放平台账号的区别
  20. 一文分析 mp4对比m3u8 第一帧加载慢的原因

热门文章

  1. xshell xshell7无法打开,转圈圈后就没反应了
  2. Python标准库之pickle
  3. redis基础教程 --基础数据类型的使用
  4. 五岁女儿给父母的一封信,看完都忍不住哭了
  5. 批处理命令批量复制文件并重命名
  6. [案例分析]一汽高工离职后揭示的中国汽车业绝对内幕!(转)
  7. 360去广告化进程加速,安全业务能否成为第二增长引擎?
  8. 未来三年最赚钱的一个机会
  9. MyBatis-Plus - 一篇带你解决自定义 SQL 注入器失效必杀技
  10. HC32F460串口驱动的问题