《程序员面试金典(第6版)》面试题 16.11. 跳水板

news2024/10/1 7:43:17

题目描述

你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。

  • 返回的长度需要从小到大排列。

示例 1

输入:
shorter = 1
longer = 2
k = 3
输出: [3,4,5,6]

解释:

  • 可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。

提示:

  • 0 < shorter <= longer
  • 0 <= k <= 100000

解题思路与代码

  • 这是一道简单题,其目的就是让我们找出跳水板所有可能的长度,并按照升序返回。
  • 因为一共就只有两种类型,然后让你使用k块板子,那么可能性就有k + 1种,我们要做的,就是返回这k + 1种长度的升序序列。

这道题我第一开始是用的while循环 + 双指针 + sort函数去做的。后来我发现根本就不用双指针,直接一个for循环就解决的事情了。不过我还是把两种方法都贴过来,让大家一起来感受一下这道题我的思考过程。

方法一:while循环 + 双指针 + sort函数

我第一开始想的是,用指针left = 0;指针right = k,然后while循环left <= right 这样的话,我们就可以包含所有的情况,当然k为双数的时候会多push一个,我们把它pop掉就好了。

因为这种方法我们只是统计了所有的可能性,并没有排序。所以我们还需要再用sort函数排序一下

具体的代码如下:

class Solution {
public:
    vector<int> divingBoard(int shorter, int longer, int k) {
        if(shorter == longer && k != 0) return {shorter * k};
        if(k == 0) return {};
        vector<int> result;
        int left = 0;
        int right = k ;
        if(k % 2 == 1){
            while(left <= right){
                result.push_back(left * shorter + right * longer);
                result.push_back(left * longer + right * shorter);
                ++left;
                --right;
            }
        }else{
            while(left <= right){
                result.push_back(left * shorter + right * longer);
                result.push_back(left * longer + right * shorter);
                ++left;
                --right;
            }
            result.pop_back();
        }
        sort(result.begin(),result.end()) ;
        return result;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

while循环会执行k/2次,因此循环内部的代码执行次数是O(k/2);
sort函数的时间复杂度为O(nlogn),这里n是result数组的大小。在最坏情况下,result数组的大小为k,所以sort的时间复杂度为O(klogk)。
由于O(klogk)大于O(k/2),所以总的时间复杂度为O(klogk)。

空间复杂度:

用于存储结果的result数组占用的空间大小与其元素个数成正比。在最坏情况下,result数组的大小为k,所以空间复杂度为O(k)。
综上所述,该代码的时间复杂度为O(klogk),空间复杂度为O(k)。

方法二:优化,不用排序,一个for循环搞定

我们用for循环变量k + 1次,每次添加一个元素,就可以做到题目要我们做的

class Solution {
public:
    vector<int> divingBoard(int shorter, int longer, int k) {
        if(k == 0) return {};
        if(shorter == longer) return {k * shorter};
        vector<int> result;
        for(int i = 0; i <=k; ++i){
            result.push_back(shorter * (k-i) + longer * i);
        }
        return result;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

for循环会执行k+1次,因此循环内部的代码执行次数是O(k)。
总的时间复杂度为O(k)。

空间复杂度:

用于存储结果的result数组占用的空间大小与其元素个数成正比。在这个优化后的代码中,result数组的大小为k+1,所以空间复杂度为O(k)。

总结

这道题目主要测试了编程能力和对时间复杂度、空间复杂度的理解。它可以帮助开发者熟悉如何在给定约束条件下解决问题。在这个问题中,你需要生成跳水板所有可能的长度,并按照升序排列。

这个问题的实际意义可能不是特别明显,但它有助于培养以下几点技能:

  • 分析问题:题目要求从给定的短板和长板中,使用恰好k块木板,生成所有可能的跳水板长度。通过对问题的分析,你可以学会如何将实际问题抽象成算法问题。

  • 算法设计:这道题目需要你设计一个算法来计算所有可能的长度。这有助于提高你的算法设计能力和思考不同的解决方案。

  • 优化:在实现初始解决方案之后,可以尝试优化算法以减少时间复杂度和空间复杂度。这个过程可以帮助你更好地理解不同解决方案之间的权衡。

  • 代码实现:这道题目要求你用代码实现算法,从而提高你的编程能力。

尽管这道题目可能没有直接的现实生活应用,但它确实有助于培养计算机科学领域所需的关键技能。这些技能对于解决实际问题和开发实际应用程序是非常重要的。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Request和Response应用

ServletRequest应用 ServletRequest应用非常广泛&#xff0c;下面是一些例子&#xff1a; 获取请求参数&#xff1a;可以使用HttpServletRequest的getParameter()方法获取请求参数。 获取请求头信息&#xff1a;可以使用HttpServletRequest的getHeader()方法获取请求头信息。…

数据结构(六)—— 二叉树(3)

文章目录 题1 589 N 叉树的前序遍历2 226 翻转二叉树递归迭代 3 101 对称二叉树递归迭代 4 104 二叉树的最大深度层序遍历直接解决递归 5 111 二叉树的最小深度层序遍历递归 6 222 完全二叉树的节点个数递归遍历 7 110 平衡二叉树递归 题 递归三部曲 1、确定递归函数的参数和返…

如何使用 PyTorch 进行半精度、混(合)精度训练

https://featurize.cn/notebooks/368cbc81-2b27-4036-98a1-d77589b1f0c4 nvidia深度学习加速库apex简单介绍 NVIDIA深度学习加速库Apex是一个用于PyTorch的开源混合精度训练工具包&#xff0c;旨在加速训练并减少内存使用。Apex提供了许多用于混合精度训练的工具&#xff0c;…

【Python基础入门学习】Python函数与变量的使用

python语法 1. 函数的快速体验2. 函数的基本使用2.1 函数的定义2.2 函数的调用2.3 第一个函数演练2.4 PyCharm 的调试工具2.5 函数的文档注释 3. 函数的参数3.1 函数参数的使用3.2 函数参数的作用3.3 形参和实参 4. 函数的返回值5. 函数的嵌套使用6 使用模块中的函数6.1 第一个…

码出高效:Java开发手册笔记(线程池及其源码)

码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09;前言一、线程池的作用线程的生命周…

剑指 Offer:003 前 n 个数字二进制中 1 的个数

题目&#xff1a; 给定一个非负整数 n&#xff0c;请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数&#xff0c;并输出一个数组 示例&#xff1a; 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …

第2关:用flex生成PL语言的词法分析器

任务描述 经过上个任务的磨砺&#xff0c;相信大家已经熟悉了lex/flex的使用。这一次我们将利用flex工具生成PL语言的词法分析器&#xff0c;要求输入一个PL语言源程序文件demo.pl&#xff0c;输出一个文件tokens.txt&#xff0c;该文件包括每一个单词及其种别枚举值&#xff0…

【五一创作】Qt quick基础1(包含基本元素Text Image Rectangle的使用)

Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09; 目录 Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09;前言qt中有直接设计ui的拖拽式的widget&#xff0c;为什么还需要Qtquick?QML语言Qt 版本创建一个Qt quick项…

两分钟学会 制作自己的浏览器 —— 并将 ChatGPT 接入

前期回顾 分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握_0.活在风浪里的博客-CSDN博客2分享4个HTML5 属性&#xff0c;开发必备https://blog.csdn.net/m0_57904695/article/details/130465836?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发…

一文解决MySQL突击面试,关键知识点总结

文章目录 MySQL重要知识点回顾一、索引1. 为什么需要索引2. 索引的结构3. 避免索引失效3.1 联合索引不满足最左匹配原则3.2 隐式转换3.3 like查询3.4 索引列存在运算或者使用函数3.5 优化器 4. 执行计划4.1 type4.2 key4.3 rows4.4 extra 5. 建立索引5.1 什么情况下应该建索引&…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…

SPSS如何制作基本统计分析报表之案例实训?

文章目录 0.引言1.制作在线分析处理报告2.制作个案摘要报告3.制作行形式摘要报告4.制作列形式摘要报告 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结…

全注解下的SpringIoc 续5-Bean的作用域

Bean的作用域主要有以下5种&#xff1a; 因为globalSession的作用域实践中基本不使用&#xff0c;所以这里就不对其过多介绍了。 另外application的作用域也完全可以用singleton作用域来代替&#xff0c;所以这里也不对其过多介绍了。 所以&#xff0c;我们主要看看singleton、…

Java——IO:输入输出流技术

简介 在java中&#xff0c;数据的输入输出都是以流的方式来处理。 流&#xff08;Stream&#xff09;&#xff0c;是一个抽象的概念&#xff0c;是指一连串的数据&#xff08;字符或字节&#xff09;&#xff0c;是以先进先出的方式发送信息的通道。 JDK中与输入/输出有关的…

Renesas瑞萨A4M2和STM32 CAN通信

刚好拿到一块瑞萨开发板&#xff0c;捣鼓玩下CAN&#xff0c;顺便试下固件升级。 A4M2 工程创建 详细可以参考&#xff0c;我之前写的文章 Renesa 瑞萨 A4M2 移植文件系统FAT32 CAN0 配置信息&#xff0c;使能FIFO&#xff0c;接收标准帧 ID为0x50&#xff0c;数据帧。 代…

汇编语言学习笔记六

flag 寄存器 CF:进位标志位&#xff0c;产生进位CF1&#xff0c;否则为0 PF:奇偶位&#xff0c;如010101b&#xff0c;则该数的1有3个&#xff0c;则PF0,如果该数的1的个数为偶数&#xff0c;则PF1。0也是偶数 ZF:在相关指令执行后&#xff08;运算和逻辑指令&#xff0c;传送指…

yml、xml、json文件

目录 一、yml &#xff08;1&#xff09;注释 &#xff08;2&#xff09;内容语法 &#xff08;3&#xff09;取名规范 二、xml &#xff08;1&#xff09;注释 &#xff08;2&#xff09;内容语法 声明头 标签 关于cdata 三、json &#xff08;1&#xff09;注释 …

MySQL库和表

MySQL库操作 创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明: 大写的表示关键字[ ]是可选项CHARACTER…

axios使用笔记

文章目录 基本语法其他语法defaults config作用案例 创建实例对象作用案例 拦截器 interceptor&#xff08;AOP&#xff09;请求取消&#xff08;节流&#xff09; 基本语法 <!doctype html> <html lang"en"> <head><meta charset"UTF-8&…

ADRC自抗扰算法优化(PLC梯形图篇)

ADRC自抗扰算法PLC梯形图完整源代码请参看下面博客文章: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清…