华为od机试真题 javascript 实现【太阳能板最大面积】
该平台提供五种编程语言的实现路径及代码库。其中包含以下内容:
- C语言代码库:可参考C语言实现目录
- C++代码库:推荐访问[C++ 实现目录]( "C++ 实现目录")
- Python代码库:详见Python实现目录
- Java代码库:访问Java实现目录
- JavaScript代码库:参考JavaScript实现目录
题目
在航天器的一侧安装长方形或正方形形状的太阳能板(图中的红色斜线区域),需要先安装两个竖立的支柱(图中的黑色竖条 ),随后将太阳能板固定在支柱上。
然而由于航天器各位置上的支柱长度不一(如图所示),太阳能板的最大可安装面积受限于最短的一端 的那根支柱的高度。例如:

现提供一组整形数组作为支柱高度数据,请计算如何选取两根相邻的支柱以获得最大可能面积的问题。
思路
1:注意题目中黑色加粗字体,我们理解一下。也就是说对于两根柱子而言,即使一个是1,一个是9,那么这个太阳能板能安装的最大面积也只是取决于最短柱子的长度,因此我们在获取这两根柱子高度时,应该选择min(arr[i],arr[j])来作为太阳能板的高度。
2:而太阳能板的宽度,则是两根柱子的索引差,用j-i即可。
3:用一个变量来保存最大的面积,通过不断比较更新最大面积。
4:暴力法 :只要两轮遍历求每两个柱子之间的组合面积即可
5:双指针法: 初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
因为每次移动短板,这个太阳板的最短板可能变大,下一个太阳板的面积可能增大。
而如果移动长板,则这个太阳板的短板不变或者变小,下一个太阳板的面积必然变小。
因此应该移动短板。
JS输入输出
JavaScript 本身有两种模式:V8 和 Node,两种模式在输入上略有不同。
Node:
> 1. let readline = require("readline");
>
> 2.
>
> 3. const rl = readline.createInterface({
>
> 4. input: process.stdin,
>
> 5. output: process.stdout,
>
> 6. });
>
> 7.
>
> 8. rl.on('line', function(line){
>
> 9. // line表示的就是输入的一行
>
> 10. let lines = line.split(' ').map(Number);
>
> 11. });
>
>
>
>
> 代码解读
V8:
> 1. //假设输入为:
>
> 2. 4
>
> 3. 5
>
> 4. 1 2
>
> 5.
>
> 6. // readline() 就表示输入的一行,和python中的 input()函数用法基本一致
>
> 7. let n = readline().split('').map(item=>parseInt(item)); // 4
>
> 8. let k = readline().split(' ').map(item=>parseInt(item)); // 5
>
> 9. let [nums] = readline().split(' ').map(item=>parseInt(item)); // 1 2
>
>
>
>
> 代码解读
具体我也是参考了网上的博主的文章:[ACM模式下JavaScript(js)的输入输出 V8 Node_我先润了的博客-博客]( "ACM模式下JavaScriptjs的输入输出 V8 Node_我先润了的博客-博客")
ACM格式javascript 输入输出 - 衣囧~ - 博客园 (cnblogs.com)
不熟悉的可以自行查阅。
这里给出这位博主的总结:
node.js=V8+内置基本模块,相当于java中的JRE=JVM+java标准库
node就是带有能操作IO和网络库的V8引擎,提供了很多可调用的API使得JavaScript能够读写文件,网络请求,系统信息等操作。对V8引擎进行了封装,执行JavaScript的速度更快,性能更好。
Code
function main(heights) {
let left = 0;
let right = heights.length - 1;
let result = -Number.MAX_VALUE;
while (true) {
if (left>=right){
break;
} else {
let diff = right - left;
let temp=0;
if (heights[left] < heights[right]){
temp = heights[left];
left+=1;
} else {
temp = heights[right];
right-=1;
}
if(diff * temp > result){
result = diff * temp;
}
}
}
console.log(result);
}
main([10, 9, 8, 7, 6 ,5, 4 ,3 ,2, 1])
代码解读
要求
时间限制: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)
