网站首页 > 资源文章 正文
近期有一些同学面试腾讯研发部,回来后跟我交流,腾讯面试整体还可以,但是有两道笔试题,当时做得很乱,后来因为这两道笔试题被拒绝了。
那我拿到这两道面试题后,并没有去搜索答案,大致心里有一些思路,做完以后又去参考了一些其它答案,整体都差不多,今天通过博文的形式给大家整理出来。
如何判断url中只包含qq.com
此题相信大家一眼都觉得很容易,但是也没这么简单,url有很多种形式: http://www.qq.com //通过 http://www.qq.com.cn //不通过 http://www.qq.com/a/b //通过 http://www.qq.com?a=1 //通过 http://www.123qq.com?a=1 //不通过
目前,我第一眼就是用正则来判断,大家可以先不看我的答案,自己看看能否手写正则做一个验证。
function check(url){
if(/.*(\.qq\.com)($|[\?\/])/.test(url)){
return true;
}else{
return false;
}
}
复制代码
上面这个正则其实比较简单,以qq.com结束或者包含?和/都可以,但是有一种情况,如果参数后面包含了url地址qq.com怎么办? http://www.qq.com?redirect=http://www.qq.com/a
function check(url){
if(/^(http:\/\/[^=]+\.qq\.com)($|[\?\/])/.test(url)){
return true;
}else{
return false;
}
}
复制代码
可以把前面的域名进行提取,以http开头,包含qq.com,但是中间不能包含=得任意字符,并以qq.com结束或者包含?和/
针对正则,我在补充一下其它知识,括号代表表达式,这个在用exec执行的时候,会按照子表达式对字符串进行搜索和匹配。
/^(http:\/\/[^=]+\.qq\.com)($|[\?\/])/ 这个正则包含了两个表达式,所以执行exec的时候,数组中就会包含三个元素,默认第一个元素是正则能够匹配到的字符串。第二个元素就是第一个表达式匹配的结果,第三个元素就是第二个表达式匹配的结果。
如何对两个超大数字字符串做相加计算
这道题看起来也比较简单,但是手写起来,还花点功夫,考察我们的思考能力、逻辑思维能力,我第一直觉,就是要转换成字符串,分别进行累加计算,最后以字符串的形式输出。 千万别想着直接parseInt!!!
同样,大家不看代码,看看自己能否做出来!
var a = '10000000000000000000000'
var b = '456789345678945678945678'
function add(a,b)
复制代码
方案一
思路:判断两个字符串长度,通过补0的方式,让他们长度相同,由于我们在学生时代,这种加减法都是从右往左,所以,我们对数组进行反转,这样就可以让计算机按照我们的想法去实现,做的过程中,一定要考虑满10进1的情况,全部算完后,再反转回来,通过join合并成字符串进行返回。
// a 和 b 都为字符串,调用add后,返回一个相加的字符串
// a = '12345678'
// b = '456789'
function add(a,b){
// 获取各自长度
let i = a.length,j = b.length;
// 判断谁大一些
let len = i - j;
let sum,sumArr = [];
// 谁小,就在谁的前面补0,让两个长度相同
// a = '12345678' b = '00456789'
if(len > 0){
b = appendZero(b,len);
}else if(len<0){
// 这个地方要把len变成正数
a = appendZero(a,Math.abs(len));
// 当b的长度比a大时,就把b的长度给i
i = j;
}
// 由于日常运算都是从右往左,所以,我们反转数组
let aArr = a.split('').reverse(), bArr = b.split('').reverse();
for(let m = 0;m < i;m++){
// 数组长度相同,同一位置的两个元素相加
// 如果当前sumArr有值,说明可能是前面以为满10进了一个1
let c = parseInt(aArr[m])+parseInt(bArr[m]) + (sumArr[m] || 0);
if(c > 9){
// 进10后,取余数
sumArr[m] = c%10;
// 如果进10了,则会往数组后一个元素放一个1
sumArr[m+1] = parseInt(sumArr[m+1] || 0)+1;
}else{
sumArr[m] = c;
}
}
// 最后数组反转,再合并成一个字符串
sum = sumArr.reverse().join('');
return sum;
}
function appendZero(str,len){
for(let i=0;i<len;i++){
str='0'+str;
}
// 或者使用ES6的repeat
// str = '0'.repeat(len) + str;
return str;
}
复制代码
这种方案看起来有点复杂,但是是比较基础的运算方法,一开始,我就考虑这么做。
方案二
function add(a,b){
// 获取各自长度
a = a.split(''), b = b.split('');
let sum=[],go=0;
while(a.length || b.length){
// 通过pop每次取一个
let num1 = parseInt(a.pop()) || 0;
let num2 = parseInt(b.pop()) || 0;
// 两值相加,如果有进位就 + go
let tmp = num1 + num2 + go;
if(tmp > 9){
go = 1;
// 取余数
tmp %= 10;
}else{
go = 0;
}
// array.unshift(item)表示在数组array的最前面插入
sum.unshift(tmp)
}
if(go) sum.unshift(1);
return sum.join('');
}
复制代码
第二个方案,看起来比第一个要更简单,通过while循环,其实也是对长度不够的进行补0,通过pop巧妙的从最后取一个元素,跟前面的数组反转如出一辙.
好了,今天简单给大家介绍两道腾讯手写面试题,希望对大家有帮助。
有什么问题,欢迎大家评论区留言讨论哦。
猜你喜欢
- 2024-09-23 一道腾讯面试题:厉害了我的杯(腾讯面试测评题)
- 2024-09-23 大佬面完腾讯后分享了这道面试题(腾讯面试40分钟)
- 2024-09-23 分享一波腾讯PHP面试题(建议收藏)
- 2024-09-23 腾讯Java面试都挂在二面,分享下失败经验+傻傻的面试经历
- 2024-09-23 腾讯后台开发程序员第二轮面试8个问题,你是否会被刷掉?
- 2024-09-23 腾讯公司python工程师面试题(含电子版)免费送
- 2024-09-23 腾讯python面试:大厂面试题都有哪些?
- 2024-09-23 人均月入6.3万,跳槽腾讯须知的TOP 10大前端面试题!
- 2024-09-23 腾讯大数据面试真题汇总(腾讯大数据岗待遇)
- 2024-09-23 腾讯前端程序员第一轮面试,这些问题你能答上几个?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)