Airbnb coding面的一道編程題

以前在直播的時候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);
相關文章
相關標籤/搜索