小伙子們,春招戰(zhàn)場簡直是如火如荼啊,各位想必收貨頗多吧~,這一周小編依舊給各位帶來幾道經(jīng)典題目:
第一題:不要借助臨時變量,實(shí)現(xiàn)兩個數(shù)字的交換?
這道題圈友給出了很多答案,正如小蟲大神所說:
位運(yùn)算高級,es6飄逸,并提供另一種笨辦法:a=a-b;b=a+b;a=b-a
不過xm同學(xué)說的很對,確實(shí)需要考慮大數(shù)溢出的情況,用c的同學(xué)整數(shù)溢出學(xué)的不錯,贊一個。而對于js來說精度問題也很明顯(你試試var a=你的身份證號試試)~
當(dāng)然這些你都可以用截取等方法輕松繞過,這里不在贅敘。先扯普通情況下的方法~
let a = 1 , b = 2 ;
[a , b] = [b , a] ;
a=a^b;
b=a^b;
a=a^b;
第二題:統(tǒng)計(jì)一個字符串中出現(xiàn)最多的字母:給出一個字符串,統(tǒng)計(jì)出現(xiàn)次數(shù)最多的字母。如:“wqeqwhixswiqhdxsq”,其中出現(xiàn)最多的是q。
這道題比較好想的一種方法就是遍歷,先轉(zhuǎn)換為數(shù)組,然后在遍歷過程中記錄每個字母出現(xiàn)的次數(shù),之后再找出次數(shù)最多的字母。這種方法比較直接的算法。還有人想到可以先對數(shù)組進(jìn)行排序,排序后只需要跟后面的字母比較就可以記錄字母出現(xiàn)的次數(shù)。這些方法都可以,這里講一個比較‘奇葩’的方法,直接擼代碼:
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;
? ? }
}
對,你沒有看錯,通過正則函數(shù)替換一步步把字符串替換成空。。。。是不是很贊~
第三題:怎么找到一個字符串的最大回文子串,如“abccbaba”的最大回文子串是“abccba”?
這道題方法也很多,復(fù)雜度差異也很大,這里小編發(fā)一個算法叫做Manacher的算法:
先在每兩個相鄰字符中間插入一個分隔符,當(dāng)然這個分隔符要在原串中沒有出現(xiàn)過。一般可以用‘#’分隔。這樣就非常巧妙的將奇數(shù)長度回文串與偶數(shù)長度回文串統(tǒng)一起來考慮了
如 #1#跟#1#1#都是奇數(shù)
然后用一個輔助數(shù)組 P[i] 來記錄以字符為中心的最長回文子串向左/右擴(kuò)張的長度。
這個算法有點(diǎn)復(fù)雜,在這里直接貼算法講解及代碼了:Manacher算法思路?Manacher算法代碼
第四題:如何合并兩個數(shù)組,如[1,2,3]與[a,b,c]合并為[1,2,3,a,b,c]?
對于js來說,這道題又是可以一步出結(jié)果的,比如使用concat,或者push
for(var i in b){
? ? ? ? a.push(b[i]);
}
甚至可以直接 、、、、
var a=[...[1,2,3],...[‘a(chǎn)’,‘b’,‘c’]]
幺鹿大神又來秀函數(shù)式編程,我就不扯了、、、、