华为OD机试题:小朋友高矮排列
本题说明:
这题目说明其实是有很大问题的,题目描述的其实是从头到位每个小朋友来和后一个比较高矮,来源是它给的样例1,[4 1 3 5 2],如果是移动步数最小,那么答案应该是[4 1 3 2 5],也就移动一步,而样例答案是[4 1 5 2 3],那么根据结果推测结果是到3跟5比较,3的index应该是高,所以5、3互换,然后2、3互换得出结果。
所以之前解题思路的错误想法反而是复杂的正确的,正确想法也是画蛇添足的方案,也不用那么复杂,你直接从前往后循环,和后面的元素比较,高的就放高的,矮的就放矮的即可。
如果题目的描述换成,再高矮的同时,要求移动步数最小,那么做法就是将数组作为一个二叉树的中序遍历的结果,然后高矮的要求,其实就变成了最小堆。根据结果推到出树结果,然后将它编程最小堆,然后再中序遍历输出结果即可。
所以在做机试时,真正难点在有限样例和不清不楚的描述下,如果能恰好符合条件才是关键。
所以给的都是参考,重点是解题想法,而不是代码,因为理解偏差和有限样例,没办法保证机试一定是对的,别为了考试而考试,还是看看数据结构和算法的好。
题目描述:
现在有一队小朋友,他们高矮不同,,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。
我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,每一个“高”位置的小朋友要比相邻的位置高或者相等;每一个“矮”位置的小朋友要比相邻的位置矮或者相等;要求小朋友们移动的距离和最小,第一个从“高”位开始排,输出最小移动距离即可。
移动距离的定义如下所示:第二位小朋友移到第三位小朋友后面,移动距离为1,若移动到第四位小朋友后面,移动距离为2。
输入描述:
排序前的小朋友,以英文空格的正整数:4 3 5 7 8
小朋友<100个
输出描述:
排序后的小朋友,以英文空格分割的正整数:4 3 7 5 8
输出结果为最小移动距离,只有5和7交换了位置,移动距离都是1
示例:
1.输入:
4 1 3 5 2
输出:4 1 5 2 3
2.输入:
1 1 1 1 1
输出:1 1 1 1 1
说明:
相邻位置可以相等
3.输入:
xxx
输出:[]
说明:
出现非法参数情况,返回空数组
#解题想法:
错误想法:一开始想法,list前后添加一个0,从位置1依次往后循环,由于list前面增加了个0,所以i%2==1的位置是高值位,如果它不是包括它在内的前后三个元素最大值,那么就将它和i+1位置对换
(此处原因是身高>0,所以从位置1开始,如果存在比它大的值,肯定在他后面位置,
因为前面一个数已经通过最小值判断了),
i%2==0的位置是低值位,如果它不是包括它在内的前后三个元素最小值,那么就将它和i+1位置对换。
但这个想法不符合最小移动步数,测试用例10 8 6 9 9,最佳结果是一步--10 8 9 6 9,
而不是两步--10 6 9 8 9正确想法:通过整体观察,list前e个最大值最终结果肯定都在高值位,那么就通过深度复制生成新的
list排序,依次找高位置的数字在不在新的list,不在的话,肯定就在低位置,那么调换他们就可以了#测试用例#4,3,5,7,8#4 1 3 5 2#10 8 6 9 9#1 1 1 1 1#10 8 6 9 9#xxxwhile 1:try:s=input()l=list(map(int,s.split(" ")))print(l)ll=l.copy()ll.sort(reverse=True)print(ll)if len(ll)%2==0:e=int(len(ll)/2)else:e=int(len(ll)/2)+1print(e)for i in range(0,len(l),2):if l[i] not in ll[0:e]:for j in range(1,len(l),2):if l[j] in ll[0:e]:tmp = l[i]l[i] = l[j]l[j] = tmpbreakprint(" ".join(map(str, l)))breakexcept Exception as e:print("[]")break
华为OD机试题:小朋友高矮排列相关推荐
- 华为OD机试题 - 最大排列(JavaScript)| 代码,编码思路,解题知识点
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...
- 华为od机试题9 真题
华为od机试题 真题 9.寻找重复字符 7.字符串翻转 6.小朋友身高排序 5.CPU最少执行时间 4.猴子爬山 3.输出信元的值 2.指定元素对最小和 1.勾股数元组 以下题目附带Java解法,是我 ...
- 华为od机试题2 真题
华为od机试题 真题 77.满足最大消费额度 76.小朋友身高位置 75.字符连续出现最大次数 74.最少停车数 73.字母多条件排序 71. 交叉排序 70.水仙花数 69.消除相邻且相同字母 以下 ...
- 华为od机试题1 真题
华为od机试题 真题 86.射击比赛成绩排序 85.计算屏幕字母数量 84.组成最大数字 82.输出字符串中最小数字 81.数字4的个数 80.整数排列 79.多条件排列 78.时间排序 以下题目附带 ...
- 华为od机试题6 真题
华为od机试题 真题 35.输出满足条件的数对 34.寻找众数中的中位数 33.分配内存 32.窗口和的最大值 31.求整数的连续自然数之和的表达式 30.矩阵的最大值 以下题目附带Java解法,是我 ...
- 华为OD机试题 - 数据分类(JavaScript)| 代码+思路+重要知识点
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...
- 华为OD机试题 - 找出重复代码(JavaScript)| 包含代码编写思路
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...
- 华为OD机试题 - 剩余可用字符集(JavaScript)| 含思路
华为OD机试题 最近更新的博客 使用说明 本篇题解:剩余可用字符集 题目 输入 输出 示例一 输入 输出 说明 Code 解题思路 华为OD其它语言版本 最近更新的博客 华为od 2023 | 什么是 ...
- 华为OD机试题 - 优选核酸检测点(JavaScript)| 代码+思路+重要知识点
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...
- 华为od机试题4 真题
华为od机试题 真题 58.处理所有作业总时长 53.最大停车距离 52.磁盘容量排序 51.非严格递增连续数字序列长度 50.均分糖果 48.没有相同字符的元素长度乘积的最大值 47. 相对开音节结 ...
最新文章
- c++ 使用对象指针
- 多线程:线程之间的协作(join、wait、notify、notifyAll、await、signal、signalAll)
- java jdkxp32_java运行环境(jre-8u65-windows-i586) 官方安装版 32位
- I2C总线以及GPIO模拟I2C
- Boost:bind绑定状态的测试程序
- 百度分享--分享按钮的实现
- MySQL调优(一):使用profiles、performance_schema性能监控
- Leet Code OJ 258. Add Digits [Difficulty: Easy]
- Vue.js 运行机制全局概览浅读
- mysql常用客户端工具
- html不存在模板,模板文件不存在,无法解析文档的解决方法
- markdown基础语法
- 对行场、带宽很好解析的一文章
- 第三类边界条件 matlab,matlab怎么解偏微分方程
- 解决win10测试麦克风显示有声音,但是实际使用teams还有其他录音设备时没有声音
- 基于公共知识和一次学习的多任务流量分类
- 3.【Python编程】字典Dict相关知识及基本操作
- 大学生如何修好进水的电脑
- 优思学院|六西格玛管理如何在物流行业中应用?
- vue页面内嵌iframe使用postMessage进行跨域通信