【千锋整理】国内互联网大厂最新面试题

一、百度面试题:

写一个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)

{

扫描二维码关注公众号,回复: 5256925 查看本文章

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<len1; i++){

for(var j=0; j<len2; j++){

items[index] = arr[0][i] +","+ arr[1][j];

index++;

}

}

// 将新组合的数组并到原数组中

var newArr = new Array(len -1);

for(var i=2;i<arr.length;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<m)//如供不应求

{

arr=arr.slice(m-n);//截取出价高的人

//console.log(arr);

}

for(let i=0;i<arr.length;i++)

{

if(max<arr[i]*(arr.length-i)){

max=arr[i]*(arr.length-i);

key=arr[i];

}

}

console.log(key);

 

参考答案思路:

本题是京东的业务演变题,首先要理清思路。本题中,固定出价,以及出价低于产品的顾客会被拒绝购买是解题核心。

条件中已知产品总个数,顾客出价。这里有个小陷阱,会出现N<M供不应求的情况,要特殊考虑。依据题目,我们首先需要对顾客出价排序,这里按升序排列。当供不应求出现时,我们截取出价高的顾客。然后把每个顾客的出价当做最终售价循环,得出最大化利润下的售价。

 

-------------------------------------------------------------------

六、华为面试题:

计算出字符串中出现次数最多的字符是什么,出现了多少次?

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<arr.length;i++)

{

var n=(s.split(arr[i])).length-1;//出现次数

if(count<n)

{

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.length; 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、新组合字符串元素=首字母转大写+其余小写。

猜你喜欢

转载自blog.csdn.net/GUDUzhongliang/article/details/87807399