代码先锋网 代码片段及技术文章聚合

华为机试练习(七)书籍叠放问题

技术标签: 算法  js  数据结构

题目描述
假设书本的叠放有这样的规则,当A书的长度和宽度都大于B书时,可以将其B书置于A的上方,堆叠摆放,请设计一个程序,根据输入的书本长宽,计算最多可以堆叠摆放多少本书?

输入
[[16,15], [13, 12], [15, 14]]

输出
3

说明
这里代表有3本书,第1本长宽分别为16和15,第2本长宽为13和12,第3本长宽为15和14,它们可以按照 [13, 12],[15, 14],[16,15] 的顺序堆叠,所以输出3

【分析】
动态规划,实质是求最长递增子序列,但本题有两个因素需要考虑,可以通过排序将长度置为有序,这样其实就是对宽度求最长递增子序列,且可能存在长度相同的情况,在更新dp数组判定时,也要考虑到

【实现】

// 获取输入
const input = "[[16,15], [16, 14], [13, 12], [15, 14]]"
// 转为数组
const arr = JSON.parse(input)
const len = arr.length

// dp数组 dp[i]表示前i本书的最长子序列长度
// 默认为1即每个序列本身就是一个子序列,长度为1
const dp = new Array(len).fill(1)

// 对输入的数组按照长度、宽度的大小进行排序
arr.sort((a, b) => {
    if (a[0] !== b[0]) {
        return a[0] - b[0]
    } else {
        return a[1] - b[1]
    }
})

// 结果,初始为1,即至少可以放一本书
let res = 1

// 从第2本书向前找,看看加上它能不能增加长度
for (let i = 1; i < len; i++) {
	// 要新加的书的长度和宽度
	const cur = arr[i]
    for (let j = 0; j < i; j++) {
    	// 要比较的书的长度和宽度
        const pre = arr[j]
        if (cur[0] > pre[0] && cur[1] > pre[1]) {
        	// 新加的书的长宽均大于当前书,说明这本书可以加在当前书的递增序列之后
        	// 判断此时的递增子序列最大值
            dp[i] = Math.max(dp[i], dp[j] + 1)
        }
        // 更新最大值结果
        res = Math.max(res, dp[i])
    }
}

console.log(res);
版权声明:本文为m0_56229413原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56229413/article/details/117743209

智能推荐

[华为机试练习题]1.周期串问题

题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。 接口说明 原型: int GetMinPeriod(char *inputstring); 输入参数: char * inputstring:字符串 返回值: int...

[华为机试练习题]26.铁路栈问题

题目 描述: 题目标题:铁路栈问题 铁路的调度站如下: 火车编号为:1~9,且不重复。 如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321&rdq...

[华为机试练习题]1.周期串问题

题目一[周期串问题] 假设一个字符串能够由某个长度为k的字符串反复多次得到,我们说该串以k为周期。比如,abcabcabcabc以3为周期(注意,它也能够6和12为周期,结果取最小周期3)。 字符串的长度小于等于100,由调用者保证。 接口说明 原型: int GetMinPeriod(char *inputstring); 输入參数: char * inputstring:字符串 返回值: in...

笔试练习--华为

笔试练习–华为 1.有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n...

[华为机试练习题]59.奖金提成

题目 描述: 输入: 输出: 例如: 练习阶段: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering =...

猜你喜欢

[华为机试练习题]51.数列求和

题目 描述: 题目描述 接口说明 原型: 输入参数: 返回值: 练习阶段: 初级 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; ...

[华为机试练习题]47.整型反序

题目 函数原型: 练习阶段: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul...

[华为机试练习题]40.求车速

题目 接口说明 原型: 输入参数: 输出参数: 返回值: 练习阶段: 初级 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var...

[华为机试练习题]28.报数

题目 描述: 题目类别: 难度: 运行时间限制: 内存限制: 阶段: 输入: 输出: 样例输入: 样例输出: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split(...

[华为机试练习题]25.圆桌游戏

题目 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addC...