Advertisement

华为od机试真题 Python 实现【太阳能板最大面积】

阅读量:

所有题目均提供五种语言的实现实例

所有题目均提供五种语言的实现实例

题目

在航天器的一侧安装矩形形状(标有"太阳能板安装区域"的部分)的太阳能板,则需要先连接两个支撑臂(图中标有"支撑结构示意图" 的黑色竖条),随后将太阳能板稳固地固定在支撑臂中间位置。
需要注意的是,在不同位置上提供的支撑臂高度存在差异(例如图所示:),因此太阳能板的实际可安装宽度最大值受限于最短支撑臂的高度。

现提供一组整形数组的支柱高度数据,请计算如何选择两根支柱可以使太阳能板的面积最大。
输入描述:
给定一个整数数组,请计算其最大子数组和。
输出描述:
最大可支持的太阳能板面积为(位于高度为1e9和某个中间值之间的两个柱子之间),其对应的面积值即为此处的最大值。
示例:
输入:-2, 1, -3, 4, -1, 2, 1, -5, 4
输出:6
解释:
该结果由子数组 [4,-1,2,1] 或者 [2,1] 得到。

思路

1:注意题目中黑色加粗字体,我们理解一下。也就是说对于两根柱子而言,即使一个是1,一个是9,那么这个太阳能板能安装的最大面积也只是取决于最短柱子的长度,因此我们在获取这两根柱子高度时,应该选择min(arr[i],arr[j])来作为太阳能板的高度。

2:而太阳能板的宽度,则是两根柱子的索引差,用j-i即可。

3:用一个变量来保存最大的面积,通过不断比较更新最大面积。

4:暴力法 :只要两轮遍历求每两个柱子之间的组合面积即可

5:双指针法: 初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

因为每次移动短板,这个太阳板的最短板可能变大,下一个太阳板的面积可能增大。

而如果移动长板,则这个太阳板的短板不变或者变小,下一个太阳板的面积必然变小。

因此应该移动短板。

输入输出

Python输入数据主要依靠input()函数来完成操作;该函数会接收控制台的一行输入内容;如果需要处理多行数据,则每次都需要单独调用该函数。

复制代码
>       1. # 输入为: 1 2 3 4 5

>  
>       2. a = input()
>  
>       3. # a = '1 2 3 4 5'
>  
>  
>  
>  
>     代码解读

2:不同于Python2,在Python3中使用input()函数会返回字符串类型的值。当输入的一行包含多个数据时,需要调用split()方法将其分割成多个元素组成的列表。

复制代码
>       1. # 输入为: 1 2 3 4 5

>  
>       2. a = input().split() # split()默认以空字符为分隔符,包括空格、换行(\n)、制表符(\t)等
>  
>       3. # a = ['1', '2', '3', '4', '5']
>  
>       4.  
>  
>       5. # 输入为:1,2,3,4,5
>  
>       6. b = input().split(',') # 以逗号为分隔符
>  
>       7. # b = ['1', '2', '3', '4', '5']
>  
>  
>  
>  
>     代码解读

3:由于input()函数会返回一个字符串,在对其进行分割操作后也会得到字符列表的结果。当输入数据为数字时,则需进行类型转换以满足后续处理需求。

可以通过逐个字符进行单独的类型转换来完成数据处理任务;或者采用列表批量处理的方式来提升效率;此外,在Python中还可以利用map()函数来进行并行处理。

map()函数的作用是将给定的可迭代对象映射到指定的目标类型上,并将其返回作为一个迭代器对象。

该迭代器对象具有不可变性,在无法直接修改其值的情况下,默认情况下无法直接对存储的内容进行修改;若需对这些值进行修改,则需将其转化为具体的列表形式以便进一步操作。

复制代码
>       1. # 输入为: 1

>  
>       2. a = int(input()) # 单个转换
>  
>       3.  
>  
>       4. # 输入为:1 2 3 4 5
>  
>       5. b = input().split() # b = ['1', '2', '3', '4', '5']
>  
>       6. c = [int(i) for i in b] # 使用列表进行批量转换 c = [1, 2, 3, 4, 5]
>  
>       7. d = [int(i) for i in input().split()] # 当然可以一步倒位
>  
>       8.  
>  
>       9. # 使用map进行并行转换
>  
>       10. e = map(int, input().split()) # 此时e是一个map迭代器,不能赋值,也不能索引
>  
>       11. f = list(e) # 转换为列表,e = [1, 2, 3, 4, 5]
>  
>       12. g = list(map(int, input().split())) # 一步到位
>  
>  
>  
>  
>     代码解读

Code

复制代码
 # coding:utf-8

    
 #JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
    
 import functools
    
 import sys
    
 from collections import Counter, defaultdict
    
 import copy
    
 from itertools import permutations
    
 import re
    
 import math
    
 import sys
    
  
    
  
    
  
    
 # 输入获取
    
 heights = [int(x) for x in input().split(",")]
    
 index1 = 0
    
 index2 = len(heights) - 1
    
 count = 0
    
  
    
 while (True):
    
     if (index1 >= index2):
    
     break;
    
     else:
    
     diff = heights[index1] - heights[index2]
    
     if diff>=0:
    
         index2 -= 1
    
     else:
    
         index1 += 1
    
     count = max(count, (index2 - index1)*(heights[index1] if heights[index1] < heights[index2] else heights[index2]))
    
  
    
 print(count)
    
    
    
    
    代码解读

要求

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld

语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)

全部评论 (0)

还没有任何评论哟~