聊聊在私立文理读cs的两年感受

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
E轮2.5亿美元融资
K12教育独角兽一起作业
北京-诚聘人工智能/教育/大数据岗
坐标湾区
Games Startup
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
码农求职神器Triplebyte:
不用海投
内推多家公司面试
把贵司招聘信息放这里
查看: 6529|回复: 6
收起左侧

问一道 Airbnb csv parser的题

[复制链接] |试试Instant~ |关注本帖
butterwang 发表于 2015-11-25 00:13:03 | 显示全部楼层 |阅读模式

2015(10-12月) 码农类General 博士 全职@Airbnb - 猎头 - 技术电面  | Other | fresh grad应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
他家经典的 csv parser 那题。. Waral 博客有更多文章,
/*
John,Smith,john.smith@gmail.com,Los Angeles,1
Jane,Roberts,janer@msn.com,"San Francisco, CA",0
"Alexandra ""Alex""",Menendez,alex.menendez@gmail.com,Miami,1
"""Alexandra Alex"""
John|Smith|john.smith@gmail.com|Los Angeles|1
Jane|Roberts|janer@msn.com|San Francisco, CA|0
Alexandra "Alex"|Menendez|alex.menendez@gmail.com|Miami|1 来源一亩.三分地论坛.
"Alexandra Alex"
*/

代码是从网上抄的
  1. import java.io.*;
  2. import java.util.*;

  3. /*
  4. * To execute Java, please define "static void main" on a class. more info on 1point3acres
  5. * named Solution.
  6. *
  7. * If you need more classes, simply define them inline.
  8. */. 留学申请论坛-一亩三分地

  9. class Solution {
  10.   public static void main(String[] args) {. 围观我们@1point 3 acres
  11.     //#1
  12.     ArrayList<String> output = parseCSV("John,Smith,john.smith@gmail.com,Los Angeles,1");. visit 1point3acres for more.
  13.     String strOutput = printStr(output);
  14.     System.out.println(strOutput);
  15.     //#2
  16.     output = parseCSV("Jane,Roberts,janer@msn.com,\"San Francisco, CA\",0");
  17.     strOutput = printStr(output);
  18.     System.out.println(strOutput);
  19.     output = parseCSV("\"Alexandra \"\"Alex\"\"\",Menendez,alex.menendez@gmail.com,Miami,1");
  20.     strOutput = printStr(output);.留学论坛-一亩-三分地
  21.     System.out.println(strOutput);
  22.   }

  23.   public static ArrayList<String> parseCSV(String str) {
  24.     ArrayList<String> res = new ArrayList<String>();
  25.     boolean inQuote = false;
  26.     StringBuilder buffer = new StringBuilder();
  27.     for(int i = 0; i < str.length(); i++) {
  28.       if(inQuote) {
  29.         if(str.charAt(i) == '"') {
  30.           if(i == str.length()-1) {
  31.             res.add(buffer.toString());
  32.             return res;
  33.           } else if(str.charAt(i+1) == '"') {
  34.             buffer.append('"');
  35.             i++;
  36.           } else {
  37.             res.add(buffer.toString());
  38.             buffer.setLength(0);
  39.             inQuote = false;
  40.             i++;
    . 1point 3acres 论坛
  41.           }
  42.         } else buffer.append(str.charAt(i));
  43.       } else {
  44.         if(str.charAt(i) == '"') {
  45.           inQuote = true;
  46.         } else if( str.charAt(i) == ',') {. 牛人云集,一亩三分地
  47.           res.add(buffer.toString());
    . 围观我们@1point 3 acres
  48.           buffer.setLength(0); 来源一亩.三分地论坛.
  49.         } else {
  50.           buffer.append(str.charAt(i));
  51.         }


  52.       }. 1point 3acres 论坛

  53.     }
  54.     if(buffer.length() > 0) res.add(buffer.toString()); 来源一亩.三分地论坛.
  55.     return res;
  56.   }

  57.   public static String printStr(ArrayList<String> list) {
  58.     StringBuilder res = new StringBuilder(); 来源一亩.三分地论坛.
  59.     for(int i = 0; i < list.size()-1; i++) {
  60.       res.append(list.get(i));
  61.       res.append('|');
  62.     } 来源一亩.三分地论坛.
  63.     res.append(list.get(list.size()-1));
  64.     return res.toString();
  65.   }. visit 1point3acres for more.
  66. }
复制代码
现在对这题还是有一些不太懂的地方。 这题的规则是
1。假如是, 转换成 |
2. 但如果 comma 在 引号里面的话,算成一个token, e.g. "San Francisco, CA" => San Francisco, CA
3. 现在问题来了,如果是有多个引号的情况,是只保留一组呢?还是只去掉一组呢?貌似从给的例子是去掉一组?""""Alexandra Alex """ => "Alexandra Alex"
但我怎么看网上很多面经题里说的是只去掉一组?
来源一亩.三分地论坛.

本帖被以下淘专辑推荐:

littlebearull 发表于 2016-11-1 11:56:26 | 显示全部楼层
请问楼主,你这个题搞清楚了规则了吗?到底是只保留一组还是只去掉一组呢?很多时候会有引号不匹配的情况呀,这种怎么handle呀
回复 支持 反对

使用道具 举报

changju0310 发表于 2017-10-27 21:45:33 | 显示全部楼层
请问楼主csv parse就这两条规则吗?
回复 支持 反对

使用道具 举报

xiemenger 发表于 2017-11-11 06:48:16 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

tpedave 发表于 2017-11-29 01:59:37 | 显示全部楼层
建议lz看下标准的cvs规则 我感觉引号里面的引号一律要用双引号,否则不是valid cvs 这个感觉要和面试官当面讨论
回复 支持 反对

使用道具 举报

flykite083 发表于 2018-1-10 01:43:36 | 显示全部楼层
看了网上好几个版本的答案,貌似都有些问题啊。好多不能处理这个例子:"Alexandra \"Alex\", Menendez, alex.menendez@gmail.com, Miami, 1"
马上要面了,求牛人给个好的解法。
回复 支持 反对

使用道具 举报

flykite083 发表于 2018-1-10 03:40:32 | 显示全部楼层
噢噢自己发现了一个相对靠谱的:https://hellosmallworld123.wordpress.com/2015/09/04/abnb-%E9%9D%A2%E7%BB%8F%E6%80%BB%E7%BB%93/
可是还是有个疑问,如果输入是"Alexandra "Alex""呢?那么输出应该是Alexandra "Alex" 还是Alexandra Alex?
回复 支持 反对

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-5-21 13:33

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表