首页 > 其他分享 >前端面试笔试题集锦(二)

前端面试笔试题集锦(二)

时间:2024-05-28 19:11:45浏览次数:13  
标签:function arr return 集锦 笔试 面试 let key obj

最近有点飘,人在江湖飘,哪能不挨刀。面试题走一波,集成一下从负责人角度常见的问题,让列位帝国精英都能成功崛起。

面试常问问题一:你如何分配前端任务和把控项目进度?

答曰:分配任务和把控进度需要根据团队成员技术指标的一个宏观把控,做到合理划分。具体来说主要有以下几方面:

1.指定项目计划,项目开始前明确项目的里程碑、目标和任务。对任务排期进行总的一个预估。

2.任务拆解。把项目任务拆解成一个一个好管理的、更小粒度的子任务。

3.确定优先级。根据任务的紧急、重要性、依赖关系划分任务的优先级,明确给成员。

4.责任划分。根据成员的经验和技术程度分配任务,注意避免任务的过度分配和任务之间的失衡。

简单的说就是定计划、拆解、定优先级、分配四步。然后实时与成员沟通进度和协作,具有风险意识和备用方案,灵活调整,综合把控。

面试常问问题二:在前端项目中如何进行协作和沟通?

沟通上的可采用的方式主要体现在:

1.使用团队协作工具:jira、微信等等交流工具;

2.定期开展团队会议:可以是日常短会或时间更长的周会。会议的内容有项目进度、解决问题、讨论需求和知识分享。

3.分享文档和知识库。

4.使用版本控制工具。

5.实时沟通。

6.倾听和尊重:鼓励成员与他人分享观点和建议。

7.及时反馈和评估。

参考:

https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=3c850e207f56463599b3017d0d89a8cc

笔试或上机出现的高频测试题:

1.如何判断回文字符数字(或回文字符串、回文数组)

// 法一:利用数组反转为字符串后与原数据比较
var isPalindrome = function(x) { if ( x < 0 ) return false let str = '' + x return Array.from(str).reverse().join('') === str };

   //  法二:以中间数为节点,判断左右两边首尾是否相等
 var isPalindrome = function(x) {
    if ( x < 0 || (x !== 0 && x % 10 === 0)) {
      return false
    } else if ( 0 <= x && x < 10) {
      return true
    }
  x = '' + x
  for(let i = 0 ; i < x.length/2; i++) {
    if (x[i] !== x[x.length - i - 1]) {
      return false
    }
  }
  return true
 };

 参考:https://blog.csdn.net/weixin_44517301/article/details/103504834

2.如何添加数字千位符?

// 法一:正则实现
/*
*这里我们直接对数字进行toString(),将其转换成字符串。

*然后使用正则表达式 /\B(?=(\d{3})+(?!\d))/g 来匹配数字中的每三位。

*\B 匹配非单词边界,也就是数字中间位置。(?=(\d{3})+(?!\d)) 是一个正向前瞻匹配,匹配后面接三位数字但是不能把最后一位数字包含进来。

*replace() 中使用逗号替换匹配到的位置。

*这样就可以非常简洁的实现三位分隔了。
*/
// const reg = /(\d)(?=(\d{3})+$)/g; // 只支持不带小数点的数字
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

// 或者:

1. 带有小数点的数据
function addThousandSeparator(number) {
    if (!isNaN(number)) {
        var source = String(number).split(".");
        source[0] = source[0].replace(new RegExp('(\\d)(?=(\\d{3})+$)', 'ig'), "$1,");//只将整数部分进行都好分割
        return source.join(".");//再将小数部分合并进来
    } else {
        return number;
    }
}
2.传进参数为数组,返回数组
function addThousandSeparator (numArr) {
    var newNumArr = [];
    for (var i = 0; i < numArr.length; ++i) {
        if (!isNaN(numArr[i])) {
            var source = String(numArr[i]).split(".");
            source[0] = source[0].replace(new RegExp('(\\d)(?=(\\d{3})+$)', 'ig'), "$1,");//只将整数部分进行都好分割
            newNumArr[i] = source.join(".");//再将小数部分合并进来
        } else {
            newNumArr[i] = numArr[i];
        }
    }
    return newNumArr;
}

// 法二:
function numberWithCommas(x) {
    x = x.toString();
    var pattern = /(-?\d+)(\d{3})/;
    while (pattern.test(x))
        x = x.replace(pattern, "$1,$2");
    return x;
}

// 法三:toLocaleString()方法
// !!!必须是数字,如果是null或者undefined的话,会报错
console.log((123456789).toLocaleString('en-US'));  // 123,456,789
// 最多保留三位小数
console.log((123456789.1315454).toLocaleString('en-US'));  // 123,456,789.132

// 法四:new Intl.NumberFormat()方法实现
console.log(new Intl.NumberFormat('en-US', {}).format(123456789.1315454));  
// 123,456,789.132
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(123456789.1315454));  
// ¥123,456,789

// 法五:
function processDot(num, precision) {
  return (+(Math.round(+(num + "e" + precision)) + "e" + -precision)).toFixed(
    precision,
  );
}
 
function formatNumber(num) {
  const result = processDot(num, 2);
  return result.replace(/\d(?=(\d{3})+\.)/g, "$&,");
}

  

3.如何找出数组(或字符串)中成员出现次数最多的那个?

参考:

https://blog.csdn.net/jianlu_blet/article/details/79364797

https://baijiahao.baidu.com/s?id=1603855462187333466&wfr=spider&for=pc

// 对于统计出现的次数的功能,还可以使用reduce的方法;具体实现如下所示:
var arr=[1,2,3,4,5,6,7,8,2,3,4,2,3,6,2,1,4,3,5,2];
arr.reduce((result,cur)=>{
result[cur]?result[cur]++:result[cur]=1
return result;
},{})

// 不统计所有成员出现的次数,只统计成员出现的最多的那个

function maxCountElement(arr) {// 传入一个字符串或者数组
let obj = {};//声明一个接收对象
for (let i = 0; i < arr.length; i++) {// 循环字符串或者数组
let key = arr[i];// 数组或者字符串下标对应的每一项 用key存起来 比如arr=[“a”,“b”,“c”]
//分别是 key=["a","b","c"][0], key=["a","b","c"][1], key=["a","b","c"][2]
if (!obj[key]) {//因为obj开始是空对象 所以初始obj[key]必然为undefined 取反
obj[key]=1;//给obj下对应的key 赋值为1,代表她第一次出现了,之前都是undefined
} else {//当数组或者字符串对应的下标元素 和之前出现的下标元素相同时,
obj[key]++;//obj下对应的key已经存在了 次数递增即可
}
}

let maxCount = 0;//声明一个number值 代表字符串或者数组内某个元素出现的最大次数
let maxElement = arr[0];// 先声明最大数为 字符串或者数组第一项
let repeatElement = [];//声明一个对象接收重复的对象
// console.log(obj,'obj')
// {a: 1, b: 2, c: 4, d: 2, e: 1, …} "obj"
for (let key in obj) {//将接收到的obj 进行for in 循环
if (obj[key] > maxCount) {//如果obj对应的下标大于 某个元素出现的最大次数
maxCount = obj[key];//则将obj对应的下标 出现的次数 用变量存下来
maxElement = key;//这个元素用maxElement存下来
repeatElement.length = 0;// 将重复的元素组成的数组 清空
} else if (maxCount === obj[key]) {//如果最大次数就等于了,接收obj对应的下标出现的次数
repeatElement.push(key);//那么将这个元素放入 接收重复元素的数组
}
}

if (repeatElement.length) {//当eq数组多于一个->也就是出现了同样重复次数的项
for (let j = 0; j < repeatElement.length; j++) {//再次循环接收重复元素的数组
maxElement += ',' + repeatElement[j];//用字符串将重复的元素 连接起来
}
}//最后将,该数组中出现次数最多的元素:maxElement 和它出现次数maxCount return出去;
return "该数组中出现次数最多的元素:" + maxElement + "-出现次数为:" + maxCount + "次";
}

let arr = ["a", "b","b","c", "c","c","c","d","e", "d", "A",];

let res = maxCountElement(arr);

console.log(res);

  

4.如何实现阶乘?

// 法1:非递归写法
function f(n) { 
    if (0 === n) { 
        return 1;
    }
    let res = 1;
    for (let i = 1; i <= n; ++i) { 
        res *= i;
    }
    return res;
}

// 法2:递归写法
function g(n) { 
    if (0 === n) { 
        return 1;
    }
    return n*g(n-1);
}

// 法3:动态规划写法
let dp = [];
function h(n) { 
    if (n < 0 || n !== Math.floor(n)) { 
        return undefined;
    }
    if (dp[n]) {   
        return dp[n];
    }
    if (0 === n) { 
        dp[n] = 1;
        return 1;
    }
    for (let i = dp.length; i <= n; ++i) { 
        dp[i] = dp[i-1]*i;
    }
    return dp[n];
}

  

5.数组如何去重{},null,undefined?

function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
        console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}]

 参考:https://zhuanlan.zhihu.com/p/684324686

6.JS如何实现斐波那契数列?

// 法1:使用迭代循环实现斐波那契数列
function fibonacci(n) {
    var fib = [0, 1]; // 斐波那契数列的前两项
    for (var i = 2; i <= n; i++) {
        fib[i] = fib[i - 1] + fib[i - 2]; // 当前项等于前两项的和
    }
    return fib[n];
}

// 法2:使用递归实现斐波那契数列
function fibonacci(n) {
    if (n <= 1) {
        return n; // 当n小于等于1时,直接返回n
    }
    return fibonacci(n - 1) + fibonacci(n - 2); // 当n大于1时,返回前两项的和
}

// 法3:使用尾递归优化实现斐波那契数列
function fibonacci(n, a = 0, b = 1) {
    if (n === 0) {
        return a; // 当n等于0时,返回a
    }
    return fibonacci(n - 1, b, a + b); // 当n大于0时,交换a和b的值,并将n减1,迭代调用函数
}


// 注意:第一种方法使用迭代循环,效率较高;第二种方法使用递归调用,代码简洁但效率较低;第三种方法使用尾递归优化可以提高效率,但需要JavaScript引擎支持尾递归优化。

  

标签:function,arr,return,集锦,笔试,面试,let,key,obj
From: https://www.cnblogs.com/yanglongbo/p/18218409

相关文章

  • Java面试
    包含的模块本文分为十九个模块,分别是:Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/SpringMVC、SpringBoot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM,如下图所示:共包含208道面试题,本文的......
  • 软件测试|面试常见十个题目(附答案),收藏好!
    金三银四的求职季如期而至,如何在这场求职大战中脱颖而出,斩获心仪的职位,前提是要做好充足的准备!接下来跟大家分享学员在面试中经常被问到的十大问题,希望对大家有启发和帮助。需要更多题库资料,简历优化辅导的话亦可联系上老师:flyhappy1111、请介绍一下你最近测试的项目举例最......
  • 最新整理|软件测试常见项目测试点&面试问题分析
    大家好!我是川石教育的老黄,最近更新了一门课程:软件测试常见项目测试点&面试问题分析。之所以录制这门课程,是因为发现大家面试的过程中,被问及实际项目的时候回答不好,说不清楚项目的数据流、业务流、测试点等等系列问题,最终导致面试失败。这门课程也是我在辅导过5000多名学员就业......
  • 当下sprign boot最火最全的经典面试题
    基础概念什么是SpringBoot?SpringBoot的核心优势是什么?SpringBoot与传统的SpringMVC项目相比,有哪些显著的区别?SpringBoot如何实现“约定优于配置”原则?请举例说明。解释SpringBoot中的StarterPOMs概念及其作用。如何在SpringBoot中自定义Starter?配置与管理Sprin......
  • AI产品经理面试——2点30开始面试,2点35就结束了
    把优秀当习惯把优秀当习惯肯定不是口头说说,那有什么判断标准吗?当我做完一件事儿的时候,我会看它有没有突破我的舒适圈、能不能惊艳到我自己。这就是我的判断标准。在自我介绍和经历介绍时,面试者应该注重以下几个方面:结构清晰:自我介绍和经历介绍应该有一个清晰的结构,按......
  • ABPVNext问题集锦-SwaggerUI的配置问题,配置Schema自动展开
    一,ABP框架中,运行的SwaggerUI中,默认情况下,不管Post还是Get等请求接口的Schema默认情况是折叠的,前端接入接口时需要一个个手动点开,如果参数过多比如100个参数 要点100次,使用不是太方便,或那种又有查询、又有新增,并且json里面各种套,对象里面有数组,数组里面套数据,  这种参数就很多了......
  • React面试题
    1.什么是React?它的特点是什么? React是一个用于构建用户界面的JavaScript库。其特点包括:使用虚拟DOM实现高效更新组件化开发,提高代码重用性和可维护性单向数据流,简化状态管理JSX语法,将组件结构和逻辑放在一起生态系统丰富,支持各种工具和库2.什么是JSX?JSX是一种JavaSc......
  • 最新JAVA面试八股文,终于整理完了
    前言今天为大家整理了目前互联网出现率最高的大厂面试题,所谓八股文也就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。而JAVA面试八股文也就是为了考验大家的JAVA基础功底,所以强烈建议背诵全......
  • Java面试--多线程
    目录Java多线程1.什么是线程?什么是多线程?2.多线程的生命周期?3.线程常出现的基本方法?4.wait()和sleep()的区别?5.实现多线程的方式?6.start()和run()的区别?7.如何正确停止线程?8.使用线程池的好处?9.线程池主要参数?10.线程池的执行过程?11.四大拒绝策略?12.线程池的各个状态?13.......
  • 2024最全java面试题整理(持续更新)
    1.springboot项目和maven项目的区别?(1)打包方式:传统项目如果需要打成war包,需要在WEB-INF目录结构配置web.xml文件;springboot则不需要(2)项目启动方式:传统web项目启动方式:在eclipse和tomcat插件中导入项目,然后启动tomcat,项目也启动了。或者将项目打成war包,放入tomcat中,启动tomca......