当前位置: 代码迷 >> 综合 >> 华为OD机试训练笔记(part1)
  详细解决方案

华为OD机试训练笔记(part1)

热度:6   发布时间:2023-12-02 07:52:13.0

题目1

题目链接

题(简单):正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

我的解(通过):

let line = readline();
let arr = line.split(' ');
let a = arr[0];
let b = arr[1];
function resfun(a,b){var i=1;var num=0;while (i>0){i++;if(i%a===0 && i%b==0){num=i;i=-1;break;}}return num;
}
console.log(resfun(a,b))

参考解:

let line = readline();
let arr = line.split(' ');
let a = arr[0];
let b = arr[1];
function gcb(a,b){if(a < b){let temp = a;a = b;b = temp;}if(a%b == 0){return b}else {return(gcb(b, a%b))}
}
console.log(a*b/gcb(a,b))

题目2

题目链接

题(中等):计算一个数字的立方根,保留一位小数。

我的解(错误:case 通过率70%):

function getResRoot(line=readline()){let target=1;while(target>0){target+=0.1;if(Math.abs(line-target*target*target)<1){target=target.toFixed(1)break}if(target*target*target-line>1){// 防止无限增加target = 0;break}if(target*target*target===line){break;}}return target;
}
console.log(getResRoot())

参考解:

while(line=readline()){var num=parseInt(line);var res=Math.pow(num,1/3);console.log((Math.round(res*10)/10).toFixed(1));
}

笔记:

  1. Math.pow() 函数返回基数(base)的指数(exponent)次幂,即 baseexponent
  2. Math.round() 函数返回一个数字四舍五入后最接近的整数。

Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法,记忆其中一些重要的方法,让结题更高效。

题目3

题目链接

题(简单):将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。

我的解(通过):

function getReverse(line=readline()){var arr=line.split("")arr=arr.reverse()var res=arr.join("")return res
}
console.log(getReverse())

参考解:

var a = readline();
var b="";
for(var i=a.length-1;i>=0;i--){b+=a[i];
}
console.log(b)

题目4

题目链接

题(较难):从输入任意个整型数,统计其中的负数个数并求所有非负数的平均值,结果保留一位小数,如果没有非负数,则平均值为0
本题有多组输入数据,输入到文件末尾,请使用while(cin>>)读入

我的解(通过):

function getRes(line=readline()){let lineArr = line.split(' ');let count=0;let average=0;let averageArr=[];for(let i=0;i<lineArr.length;i++){if(Number(lineArr[i])<0){count++;}else{averageArr.push(lineArr[i])}}let sum=0;for(let i=0;i<averageArr.length;i++){sum += Number(averageArr[i]);}average=sum/(averageArr.length-1); // 这里取平均长度要减一console.log(count,average)
}
getRes()

参考解:

while(line=readline()){var arr=[],j=0,add=0arr=line.split(' ')arr.forEach((v,i)=>{if(Number(v)<0){v=0j++}else{add += Number(v)}})let a = parseFloat(add/(arr.length-j-1)).toFixed(1)console.log(j)console.log(a)
}

题目5

题目链接

题(较难):连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组,长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

我的解(通过):

while(n=readline()){for(let i=0;i<n;i++){substrFn(value=readline());}
}
function substrFn(value){if(value.length===0){// 为0判断return;}if(value.length>=8){console.log(value.substr(0,8));let dgvalue=value.substr(8,value.length-8);substrFn(dgvalue);// 递归}else{let len=value.length;let resvalue=value;for(let j=0;j<8-len;j++){resvalue+='0'}console.log(resvalue)}
}

参考解:

while (n=readline()){for(var i=0;i<n;i++){var value=readline();while(value.length>8){console.log(value.substr(0,8));value=value.substr(8);}if(value.length>0){console.log((value+'00000000').substr(0,8));}}
}

题目6

题目链接

题(中等):Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗?

样例输入62 5 1 5 4 5样例输出3提示Example: 
6个点的高度各为 2 5 1 5 4 5 
如从第1格开始走,最多为3步, 2 4 5 
从第2格开始走,最多只有1步,5 
而从第3格开始走最多有3步,1 4 5 
从第5格开始走最多有2步,4 5所以这个结果是3。

我的解(未通过):

function getres(n=readline()){let value=readline()let arr=value.split('')let countStepArr=[]for(let i=0;i<n;i++){// 双循环let countStep=0for(let j=i;j<n-i;j++){if(arr[j]>arr[i]){countStep++}}countStepArr.push(countStep)}let res=countStepArr.sort((a,b)=>{return a-b})console.log(res[res.length-1])
}
getres()

参考解:

while(n=readline()){let arr = readline().trim().split(' ').map(Number);let dp = []for(let i=0;i<arr.length;i++){dp[i]=1for(let j=0;j<i;j++){if(arr[j]<arr[i]){dp[i]=Math.max(dp[j]+1,dp[i])}}}console.log(Math.max(...dp))
}
  相关解决方案