面试-前端编程思路

编写一个js函数,该函数有一个n(数字类型),其返回值是一个数组,该数组内是n个随机且不重复的整数,且整数取值范围是[2,32]


题目解读


输入一个数字类型的参数n,会返回一个包含2到32的数字的数组,数组长度是n(比如你输入数字是2,就会返回数组长度为2的数组); 数组里面的数字用 随机函数 生成,然后还要检查数字是否会重复,也要考虑负数情况等边界条件

知识点


Math.ceil();   //向上取整。
Math.floor(); //向下取整。
Math.round(); //四舍五入。
Math.random(); //0.0 ~ 1.0 之间的一个伪随机数。【包含0不包含1) 比如0.8647578968666494
Math.ceil(Math.random()*10); // 获取从1到10的随机整数 ,取0的概率极小。
Math.round(Math.random()); //可均衡获取0到1的随机整数。
Math.floor(Math.random()*10); //可均衡获取0到9的随机整数。
Math.round(Math.random()*10); //基本均衡获取0到10的随机整数,其中获取最小值0和最大值10的几率少一半。

直接使用 parseInt,parseFloat 或 Number 将一个非数字的值转化为数字时,表达式返回 NaN

'abc' - 3   // NaN
parseInt('abc') // NaN
parseFloat('abc') // NaN
Number('abc') // NaN

isNaN() 是一个全局方法,它的作用是检查一个值是否能被 Number() 成功转换 。 如果能转换成功,就返回 false,否则返回 true

isNaN(NaN)    // true 不能转换
isNaN('123') // false 能转换
isNaN('abc') // true 不能转换
isNaN('123ab') // true 不能转换
isNaN('123.45abc') // true 不能转换

生成随机数方法总结


生成[1,max]的随机数,公式如下:

// max - 期望的最大值
parseInt(Math.random()*max,10)+1;
Math.floor(Math.random()*max)+1;
Math.ceil(Math.random()*max);

生成[0,max]到任意数的随机数,公式如下:

// max - 期望的最大值
parseInt(Math.random()*(max+1),10);
Math.floor(Math.random()*(max+1));

生成[min,max]的随机数,公式如下:

// max - 期望的最大值
// min - 期望的最小值
parseInt(Math.random()*(max-min+1)+min,10);
Math.floor(Math.random()*(max-min+1)+min);

编程思维:


可用 —> 健壮 —> 可靠 —> 宽容

健壮:

  • 最基本的兼容性处理、边界处理、异常处理、用户输入校验
  • 对n的取值范围进行校验;对n是否为数字进行校验;对n是否存在进行校验

宽容:

  • n是一个字符串数字,是否允许进入处理流程?是的话,经验系数*1.1
  • n是一个含有小数的数字,是否允许进入处理流程?是的话,经验系数*1.1
  • 代码是否有足够多且清晰的注释?是的话,经验系数*1.2
  • 调整[2,32]的范围,你的代码是否可以快速调整甚至不用调整?是的话,经验系数*1.2

伪代码

// 生成一个随机数
function getRand(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}

// 去重校验
// function checkArrIn(rand,array){
// if(array.indexof(rand) > -1){
// return true;
// }
// return false;
// }

// 判断n是不是一个数字,包含字符串类型的数字
function isNotNum(n){
return isNaN(Number(n)) ? true : false
}

// 判断n是不是在范围内
function isRandOk(n, min, max){
return n >= min && n <= max ? true : false
}

// 判断n是不是含有小数的数字
function isXiaoShu(n){
return String(n).indexOf(".") > -1 ? true : false
}

// 去重检验 arr.includes(e) includes 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
function fn(n){
// 准备一个容器保存结果
let arr = [];
// 将整数取值范围用变量保存起来
let min = 2;
let max = 32;

// 参数校验
if (isNotNum(n)) return [];
if (!isRandOk(n,min,max)) return [];
if (isXiaoShu(n)) return [];

for(let i = 0; i < n; i++){
let rand = getRand(min, max);
if (arr.includes(rand)) {
i--; // 减一是因为如果第i次循环的时候如果数组有了该值,就重新走一遍
} else {
arr.push(rand);
}
}
return arr
}

fn(2); // (2) [15, 11] 随机
fn('5'); // (5) [13, 2, 11, 27, 12] 随机
fn('3.33'); // []
fn(5.5); // []

延伸

程序员!为什么你的前端工作经验不值钱?

-------------本文结束 感谢您的阅读-------------
0%