以前在直播的时候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);