编程题:寻找木头
寻找木头
JD 2022 校招
时问限制:3000MS
内存限制:589824KB
题目描述:
小明和他的伙伴发现了一堆木头排成了一排,一共n个,假设排列在x轴上,最左端的木头的坐标是0,最右端木头的坐标是n,他们想拿走里面最重和最轻的木头各一个,但是他们并不知道是这一堆里的哪一个,因此他们需要挨个测量。现在他们在这排木头的两端,一个人在坐标0,一个人在坐标n,他们只能按顺序测量,即在0位置的人只能依次测量0.1.2,3然后到n,在n位置的人则相反。现在你已经知道每个木头的重量,你可以指挥他们是否继续测显,问两个人一共最少需要多少次测量就可以找到最重和最轻的木头。
输入描述:
第一行一个整数n,1<=n<=1000
第二行n个空格隔开的整数,表示木头的重层,某中任意一个数大小范围是(0.10000].
输出描述:
个整数,表示最少需要测量的次数。
样例1
输入
5 1 5 4 3 2
输出
2
解释:从左测量1,然后测量5,就可以了
样例2
输入:
8 2 1 3 4 S 6 8 7
输出:
4
解释:从左测量2然后测量1,从石测量然后测量8
题解:
一开始我的思路是
找到数组的最大值最小值距离两端的最小距离,如果都距离一端近,就输出两个最小距离的最大值(如样例1);
如果分别距离首尾近则输出两个最小距离的和(如样例2);
但如果是最大值最小值都很靠正中间,最大值最小值的之间距离小于最大值最小值距离两边的距离输出两个最小距离的最小值加上两个最大值最小值之间的距离。
想到这里的时候就不对劲了,换一个思路:
还是找数组的最大值最小值距离两端的最小距离,还是上面的判断条件,
但是需要解决上面分类复杂的问题,
如果最大值和最小值之间的距离很大,则是两边输出,如果最大值和最小值之间的距离(abs(maxidx - minidx))很小,那么适合单边距离的最大值。
那这个距离的阈值怎么找的呢?
首先如何判断最大值最小值之间的距离是大还是小:
如果最大值最小值之间的距离(abs(maxidx - minidx))大于最大值最小值距离两边的最小值,那么适合两边距离的和;
如果最大值最小值之间的距离(abs(maxidx - minidx))小于最大值最小值距离两边的最小值,那么适合单边距离的最大值;
到这里思路就明朗起来了。
代码如下:
N = int(input()) list = inpu 56c t().split(' ') maxidx = list.index(max(list)) # 最大值索引 minidx = list.index(min(list)) # 最小值索引 len = abs(maxidx -minidx) - 1 #最小值和最大值中间的元素个数(左开右开) if len < N/2: out = min(max(maxidx, minidx) + 1, max(N-maxidx, N-minidx)) else: out = N - len print(out)
执行效果:
- 编程题:在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
- [编程题] 寻找三角形
- 编程题—寻找第K大
- [编程题] 寻找三角形
- 腾讯2016实习生笔试编程题 寻找最佳路径
- Java50道经典编程题:(十九)菱形的打印 ——寻找规律解决问题
- C/C++编程题刷题:leetcode153. 寻找旋转排序数组中的最小值
- [编程题] 寻找三角形
- 微软编程题:寻找最小的k个值
- Java50道经典编程题:(二十)分数数列求和 ——寻找规律解决问题
- 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array
- 百度2017春招笔试真题编程题集合之寻找三角形
- 百度2017春招笔试真题编程题集合--寻找三角形
- 寻找三角形(编程题)
- 百度2017春招笔试真题编程题集合:寻找三角形 [python]
- C语言编程题——下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
- 百度2017春招笔试真题[编程题] 寻找三角形
- [编程题]在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向比较
- 网易2016实习研发工程师编程题——寻找第K大
- POJ C程序设计进阶 编程题#4:寻找平面上的极大点