• 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);
    
  • 相关阅读:
    【AHOI2009】 维护序列
    Codeforces Hello 2019 F. Alex and a TV Show[bitset+莫比乌斯反演]
    Codeforces Hello 2019 D. Makoto and a Blackboard[DP+数论+概率期望]
    Codeforces Hello 2019 ABCDF题解
    [BZOJ1042][HAOI2008]硬币购物[容斥原理+背包]
    Codeforces Round #529 (Div. 3)题解
    [BZOJ4311]向量[线段树分治+计算几何+二分/三分]
    [BZOJ1076][SCOI2008]奖励关[状压DP+概率期望]
    [POJ3368][UVA11235] Frequent values[ST表]
    [USACO5.5]矩形周长Picture[扫描线+线段树]
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/9181107.html
Copyright © 2020-2023  润新知