深圳Web培训:大厂Web面试题详解

深圳Web培训:大厂Web面试题详解
深圳Web培训:大厂Web面试题详解_第1张图片
一、百度面试题:
写一个js函数,实现对一个数字每3位加一个逗号,如输入100000, 输出100,000(不考虑负数,小数)
var arr=[];
function main(num) {
if (num=== null) return;
var n = parseInt(num).toString();
s(n);
}
function s(num){
if(num.length>3)
{
arr[arr.length]=num.slice(-3);
s(num.slice(0,-3));
}
else{
arr[arr.length]=num;
}
}
main(123456789);
console.log(arr.reverse().join(","));
参考答案思路:
本题是js实现number.toLocaleString()方法,面试题做了简化不考虑负数小数,此题主要是考数据类型及字符串操作,答案不唯一。
按现实思路解题,现实中添加千位分隔符是从后到前,每3位添加逗号,所以这里输入数据转换成字符串后,利用slice方法的输入负数参数从后取的特点,从后取三位数字保存在数组中,并把取剩后的数据递归重复取值,直到数据不足3位,把剩下一起存入数组中。
这时数组中按顺序保存从后到前的分割数据。实例中数组是[‘789’,’456’,’123’]。通过reverse方法倒叙输出,并通过join方法添加逗号。


二、字节跳动面试题:
给定一个字符串,找出其中无重复字符的最长子字符串长度

function StrLen(str){
var result = 1; // 最终要返回的结果的初始值
var norepeatStr = ‘’; // 用于存放无重复子串
var len = str.length;
for(var i = 0; i < len; i++){
// charAt()获取的是字符串索引对应的具体字符
var specStr = str.charAt(i);
// indexOf()查找的是某个字符第一次出现并返回这个索引值,若没有这个字符,返回-1
var index = norepeatStr.indexOf(specStr);
if(index === -1){
// 将遍历得到的字符(未重复)拼接在norepeatStr后面
norepeatStr = norepeatStr + specStr;
result = result < norepeatStr.length ? norepeatStr.length : result;
}else{
// 若遇到重复的字符,那么将已出现在norepeatStr里的字符删除,并将新的(重复的)添加到末尾
norepeatStr = norepeatStr.substr(index+1) + specStr;
}
}
return result;
}
console.log(StrLen(“abbbcbd”));

参考答案思路:
这题的要点就是无重复字符的理解。首先字符串内字符位置是固定的,我们要采用顺序循环的方式解题,然后就是理解无重复字符的含义,把当前字符串分割,每个小分割内不能出现重复的字符。也就是说分割的字符串是不会互相叠加重复的,每当该段分割的下一个字符与该段分割内字符相同,当即重新开始分割字符。

所以解题时需要一个存储当前分割片段的对象,用来比较下一个字符。并取这个分割片段的长度,与每个分割片段的最大长度比较即可。
本题主要考的是题面的理解,以及字符串方法的运用,需要熟练地运用才能快速解题。


三、腾讯面试题:
实现超出整数存储范围的两个大正整数相加
function func(){
var a = ‘123123231231234444435’
var b = ‘434235656455454543’
var n1 = a.length;
var n2 = b.length;
for(let i = 0; i < Math.max(n1, n2)-Math.min(n1, n2); i++){
if(n1 > n2) b = ‘0’ + b;
if(n1 < n2) a = ‘0’ + a;
}
a = a.split(’’).reverse();
b = b.split(’’).reverse();
//split()基于指定的分隔符将一个字符串分隔成多个子字符串, 并将结果放在一个数组中
//reverse() 反转数组项的顺序(加法计算顺序)
//现在a,b数组中存储着相同个数的大数字的逆顺序拆解
var n = Math.max(n1, n2);
var result = Array.apply(this, Array(n)).map((item, i) => {
return 0;
})
//生成一个长度为n的每个元素都为0的数组(用来保存最终结果)
for(let k = 0; k < n; k++){
var temp = parseInt(a[k])+parseInt(b[k])
if(temp > 9){
result[k] += temp -10 ;
result[k+1] = 1;
}else{
result[k] += temp;
}
}
//把ab数组中的数字相加减,注意进位。
console.log(result.reverse().join(’’).toString())
//将数组项基于指定的分隔符以字符串输出
}
func();

参考答案思路:
首先了解超出存储范围的大数字概念,每种数据类型可存储数据量都是存在范围的
数字类型的范围:
Number.MAX_VALUE = 1.7976931348623157e+308
Number.MIN_VALUE = 5e-324
整数类型的范围:-2-53-253
当超出这个范围,为了避免数据丢失,就要采用其他手段进行运算。在参考答案中,运用数组的方式解决这个问题。首先两个大整数要存储在数组中,要先保证位数对其,我们比较字符串长度把低位数的大整数字符串前面添加相应的0占位, 并逆排序。创建一个新的数组保存运算结果,将两个大整数按从后到前的顺序进行相加减,这里注意进位。把得到的数组反转到正常顺序即可。

四、阿里巴巴面试题:
任意二维数组的全排列组合
// 执行组合排列的函数
function exchange(arr){
var len = arr.length;
// 当数组大于等于2个的时候
if(len >= 2){
// 第一个数组的长度
var len1 = arr[0].length;
// 第二个数组的长度
var len2 = arr[1].length;
// 2个数组产生的组合数
var lenBoth = len1 * len2;
// 申明一个新数组,做数据暂存
var items = new Array(lenBoth);
// 申明新数组的索引
var index = 0;
// 2层嵌套循环,将组合放到新数组中
for(var i=0; i for(var j=0; j items[index] = arr[0][i] +","+ arr[1][j];
index++;
}
}
// 将新组合的数组并到原数组中
var newArr = new Array(len -1);
for(var i=2;i newArr[i-1] = arr[i];
}
newArr[0] = items;
console.table(newArr[0]);//这里可以看一下结果,有助于理解
// 执行回调
return exchange(newArr);
}else{
return arr[0];
}
}

//执行
var array= [[‘A’,‘B’,‘C’],[‘A1’,‘B1’,‘C1’],[‘A2’,‘B2’]]
console.log(exchange(array));

参考答案思路:
本题做法不唯一,这里采用了把多项数组逐步两两相乘的方式,第一次先取二维数组前两项组合,把组合的结果在与第三项组合以此类推。这种递归做法简单易懂,把复杂的多项问题简化成两项问题的逐渐递增。


五、京东面试题:公司最近新研发了一种产品,共生产了n件。有m个客户想购买此产品,已知每个顾客出价。为了确保公平,公司决定要以一个固定的价格出售产品。每一个出价不低于要价的客户将会得到产品(每人只买一个),余下的将会被拒绝购买。请你找出能让公司利润最大化的售价。
var n=3;
var m=4;
var arr=[2,8,10,7]; //顾客出价
var key=0,max=0;
var arr=arr.sort(function(a,b){
return a-b;//升序
});
if(n {
arr=arr.slice(m-n);//截取出价高的人
//console.log(arr);
}
for(let i=0;i {
if(max(arr.length-i)){
max=arr[i](arr.length-i);
key=arr[i];
}
}
console.log(key);

参考答案思路:
本题是京东的业务演变题,首先要理清思路。本题中,固定出价,以及出价低于产品的顾客会被拒绝购买是解题核心。
条件中已知产品总个数,顾客出价。这里有个小陷阱,会出现N


六、华为面试题:
计算出字符串中出现次数最多的字符是什么,出现了多少次?
var s=‘aaasdaddddddddddaf’;
var count=0,char="";//count出现次数char字符
var arr=[];//储存去重后字符
function foo(str){ //去重
return r = str.split("").filter(function(element,index,self){
return self.indexOf(element) === index;//输出第一次出现的字符
});
}
arr=foo(s);
for(let i=0;i {
var n=(s.split(arr[i])).length-1;//出现次数
if(count {
count=n;
char=arr[i];
}
}
console.log(“count:”+count+",char:"+char)

参考答案思路:
本参考答案是计算出全部字符出现次数,并留下最大的。首先利用filter()与indexOf()的方法连用字符串去重,再将得到的作为索引,利用split()分割字符串,得到字符出现次数,比较得出结果。

七、小米面试题:
"123456789876543212345678987654321…"的第n位是什么?
var k=“1234567898765432”;//最小循环节
function getNum(n)
{
console.log(k.charAt(n%k.length-1));
}
getNum(20);
参考答案思路:
本题答案不唯一,这里利用数学中最小循环节的概念解题,找到最小循环节后,利用余数查找第n位数字。

八、淘宝面试题:
请编写一个 JavaScript 凼数 parseQueryString,它的用途是把 URL 参数解析为一个对象
function parseQueryString(url) {
var pos = url.indexOf("?");
var obj = {};
if (pos != -1) {
var urlstring = url.slice(pos + 1);
var urlArr = urlstring.split("&");
var keyValue = [];
for (var i = 0; i < urlArr.length; i++) {
keyValue = urlArr[i].split("=");
obj[keyValue[0]] = keyValue[1];
}
}
return obj;
}
console.log(parseQueryString(“546456?a=1&b=2”));
参考答案思路:
淘宝这道题是很常用的场景题,这里需要处理好分段次序,首先把?分离,然后按&分割最后按=分割,主要考察字符串的函数运用以及对象的创建。


九、网易面试题:

如果给定的字符串是回文,返回true,反之,返回false。
回文:如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

function palindrome(str){
var str1 = str.replace(/[^0-9a-zA-Z]/g,"").toLowerCase(); //去掉标点符号,转化成小写,比较参数一
//alert(str1); //输出:abc1d42efg000h000gfe24d1cba
var str2 = str1.split("").reverse().join(""); //翻转字符串,比较参数二
//alert(str2); //输出:abc1d42efg000h000gfe24d1cba
if (str1 === str2) {
return true;
} else{
return false;
}
}
console.log(palindrome(“aBc,./1d42–==EFG0 00 h0-’;‘00gfE’;./. 24d 1cBA”)); //输出结果:true

参考答案思路:去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。

十、搜狐面试题:
确保字符串的每个单词首字母都大写,其余部分小写。
function titleCase(str){
var aStr = str.toLowerCase().split(" “); //转小写,分割成字符串数组
for(var i=0; i aStr[i] = aStr[i][0].toUpperCase()+aStr[i].slice(1); //重新组合字符串元素
}
var oString = aStr.join(” "); //转成字符串
return oString;
}
console.log(titleCase(“I’m a title Case.”)); //输出结果:I’m A Title Case.
参考答案思路:1、字符串转化成小写;2、分割成字符串数组;3、新组合字符串元素=首字母转大写+其余小写。

你可能感兴趣的:(深圳Web培训,Web培训,Web,培训)