以前在直播的時候Airbnb負責人說他們的coding題難度不會到dp,我就知道確定是一些字符串處理啥的編程題了。面試
果真,Airbnb的coding面是在codePad上手寫代碼,面試官但願能看到你書寫的過程,因此少用本地ide(呵呵,不調試讓寫編程題是最XX的,因此有些東西你須要及時溝通)正則表達式
本身給的三四個test case,要求輸出對應的結果就好了(比ACM是至關寬鬆了)。編程
題目是這樣的,很簡單:api
有這樣的文本(我轉js的字符串了)ide
let str1 = 'rwer321,dad,adas,ytruty,yihgf'; let str2 = '"ha,ua",sa,da,""da,da"",dad'; let str3 = 'dasd,""asddad"",fsfsf,gdfg,1'; let str4 = '"ha,ua",sa,da,"""da,da""",dad
要求對應轉換成這樣的:函數
rwer321|dad|adas|ytruty|yihgf
ha,ua|sa|da|"da,da"|dad
dasd|"asddad"|fsfsf|gdfg|1
ha,ua|sa|da|""da,da""|dad調試
本意就是單詞分詞,逗號分開每一個單詞,可是用引號包圍的是一個總體單詞,不能隨便用逗號分開,若是超過一雙引號以上,去掉一層引號引導,剩下的是一個總體,至關於把引號轉義稱文本單詞中的一部分。code
一開始思路受到以前項目的影響,以前寫親測模版的時候用到不少正則表達式,因而這裏也想用正則,可是是走不通的(過後我用正則想了幾個小時,仍是不能適用這道題的全部狀況)。因此老老實實看成字符串題目來作。字符串
C++好久沒寫了,不現查C++的api就寫不了,因此如今徹底是入了js的坑了。其實感受js寫起來更順暢一些,由於函數庫和字符串沒C++那麼複雜。字符串處理
個人代碼,線性時間複雜度,用deep記錄下引號的深度同時記錄單詞的起始位置和終止位置,分好狀況便可:
let str1 = 'rwer321,dad,adas,ytruty,yihgf'; let str2 = '"ha,ua",sa,da,""da,da"",dad'; let str3 = 'dasd,""asddad"",fsfsf,gdfg,1'; let str4 = '"ha,ua",sa,da,"""da,da""",dad' function done(str) { str += ','; let len = str.length; let deep = 0; let flag = 0; let start = 0; let end = 0; let res = []; let pos = 0; while (pos < len) { if (str[pos] === '"'&&flag!==1) { flag = 1; start = pos; while(str[pos]==='"') { deep++; pos++; } }else if(str[pos]==='"'&& flag===1) { res.push(str.slice(start+1,pos+deep-1)); pos+=deep; start = pos+1; deep=0; flag=0; }else if(str[pos]===','&&flag===0) { res.push(str.slice(start,pos)); start = pos+1; } pos++; } res = res.join("|"); return res; } console.log(done(str1)); console.log(done(str2)); console.log(done(str3)); console.log(done(str4));
以前用正則去作,走不通,麻煩有人用正則作出來了通知我一下,謝謝。
let str1 = 'rwer321,dad,adas,ytruty,yihgf'; let str2 = '"hfg,utyut",sasa,dadas,""dada,dasd"",dad'; let str3 = 'dasd,""asddad"",fsfsf,gdfg,1'; // dada, adads|dada|dasd // dasd|"asddad"|fsfsf|gdfg|1 function done(str) { let res = []; str += ","; let Pa1 = /""([^"]+)""/; let re1 = new RegExp(Pa1,'g'); let ans1 = str.match(re1); console.log(ans1); if(ans1.length!==null) { ans1.map(function(d,i){ // console.log(d); // d = d.replace(",","^001"); // console.log(d); str = str.replace(d+",", d.slice(1,-1)+"|"); }); }; let Pa2 = /"([^"]+)",/; let re2 = new RegExp(Pa2,'g'); let ans2 = str.match(re2); console.log(ans2); if(ans2.length!==null) { ans2.map(function(d,i){ // d = d.replace(",","^001"); str = str.replace(d,d.slice(1,-2)+"|"); }); }; // let Pa3 = /[^"|]+,/; // let re3 = new RegExp(Pa3,'g'); // let ans3 = str.match(re3); // console.log(ans3); // if(ans3.length!==null) { // ans3.map(function(d,i){ // str = str.replace(d,d.slice(1,-2)+"|"); // }); // }; // console.log(str); // str.split(',').map(function(d,i) { // res.push(d); // }); // let ans = res.join('|'); // console.log(str); // let re = new RegExp(Pattern,'g'); // let Pattern = /"(.*)"/; // let re = new RegExp(Pattern,'g'); // let tmp; // let res = str.split(',').map(function(d,i) { // let flag = 0; // let len = d.length; // if(d[len-1]==='"') { // tmp += d; // flag = 1; // } // if(flag) { // return tmp.slice(1,-1); // } // tmp = d; // if(d[0]!=='"') { // return d; // } // }); // let len = str.length; // for(let i = 0; i < len; i++) { // } console.log(str); } done(str2);