zoukankan      html  css  js  c++  java
  • Airbnb coding面的一道编程题

    之前在直播的时候Airbnb负责人说他们的coding题难度不会到dp,我就知道肯定是一些字符串处理啥的编程题了。

    果然,Airbnb的coding面是在codePad上手写代码,面试官希望能看到你书写的过程,所以少用本地ide(呵呵,不调试让写编程题是最XX的,所以有些东西你需要及时沟通)

    自己给的三四个test case,要求输出对应的结果就行了(比ACM是相当宽松了)。

    题目是这样的,很简单:

    有这样的文本(我转js的字符串了)

    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

    本意就是单词分词,逗号分开每个单词,但是用引号包围的是一个整体单词,不能随便用逗号分开,如果超过一双引号以上,去掉一层引号引导,剩下的是一个整体,相当于把引号转义称文本单词中的一部分。

    一开始思路受到之前项目的影响,之前写亲测模版的时候用到很多正则表达式,于是这里也想用正则,但是是走不通的(事后我用正则想了几个小时,还是不能适用这道题的所有情况)。所以老老实实当作字符串题目来做。

    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);
    
  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/9181107.html
Copyright © 2011-2022 走看看