小伙子们,春招战场简直是如火如荼啊,各位想必收货颇多吧~,这一周小编依旧给各位带来几道经典题目:
第一题:不要借助临时变量,实现两个数字的交换?
这道题圈友给出了很多答案,正如小虫大神所说:
位运算高级,es6飘逸,并提供另一种笨办法:a=a-b;b=a+b;a=b-a
不过xm同学说的很对,确实需要考虑大数溢出的情况,用c的同学整数溢出学的不错,赞一个。而对于js来说精度问题也很明显(你试试var a=你的身份证号试试)~
当然这些你都可以用截取等方法轻松绕过,这里不在赘叙。先扯普通情况下的方法~
let a = 1 , b = 2 ;
[a , b] = [b , a] ;
a=a^b;
b=a^b;
a=a^b;
第二题:统计一个字符串中出现最多的字母:给出一个字符串,统计出现次数最多的字母。如:“wqeqwhixswiqhdxsq”,其中出现最多的是q。
这道题比较好想的一种方法就是遍历,先转换为数组,然后在遍历过程中记录每个字母出现的次数,之后再找出次数最多的字母。这种方法比较直接的算法。还有人想到可以先对数组进行排序,排序后只需要跟后面的字母比较就可以记录字母出现的次数。这些方法都可以,这里讲一个比较‘奇葩’的方法,直接撸代码:
while(str != ""){
var oldstr = str;
var getstr = str.substr(0,1);
str = str.replace(new RegExp(getstr,"g"),"");
if (oldstr.length - str.length >maxlength){
maxlength = oldstr.length - str.length;
result = getstr + '='+ maxlength;
}
}
对,你没有看错,通过正则函数替换一步步把字符串替换成空。。。。是不是很赞~
原文如下:利用正则找出字符串中出现最多的字母
第三题:怎么找到一个字符串的最大回文子串,如“abccbaba”的最大回文子串是“abccba”?
这道题方法也很多,复杂度差异也很大,这里小编发一个算法叫做Manacher的算法:
先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了
如 #1#跟#1#1#都是奇数
然后用一个辅助数组 P[i] 来记录以字符为中心的最长回文子串向左/右扩张的长度。
这个算法有点复杂,在这里直接贴算法讲解及代码了:Manacher算法思路 Manacher算法代码
第四题:如何合并两个数组,如[1,2,3]与[a,b,c]合并为[1,2,3,a,b,c]?
对于js来说,这道题又是可以一步出结果的,比如使用concat,或者push
for(var i in b){
a.push(b[i]);
}
甚至可以直接 、、、、
var a=[...[1,2,3],...[‘a’,‘b’,‘c’]]
幺鹿大神又来秀函数式编程,我就不扯了、、、、