传说中的谷歌招聘委员会成员之一,从幕后走出来,教你学系统设计!


一亩三分地论坛

 找回密码
 获取更多干活,快来注册
天天打游戏、照样领工资、还办H1B
这份工作你要不要?
把贵司招聘信息放这里
查看: 4921|回复: 1
收起左侧

问一道 Airbnb csv parser的题

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

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

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

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

x
他家经典的 csv parser 那题。.1point3acres缃
/*
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. /*. 1point3acres.com/bbs
  4. * To execute Java, please define "static void main" on a class
  5. * named Solution.
  6. *
  7. * If you need more classes, simply define them inline.
  8. */
  9. -google 1point3acres
  10. class Solution {
  11.   public static void main(String[] args) {
  12.     //#1.鏈枃鍘熷垱鑷1point3acres璁哄潧
  13.     ArrayList<String> output = parseCSV("John,Smith,john.smith@gmail.com,Los Angeles,1");
  14.     String strOutput = printStr(output);.1point3acres缃
  15.     System.out.println(strOutput);
  16.     //#2
  17.     output = parseCSV("Jane,Roberts,janer@msn.com,\"San Francisco, CA\",0");
  18.     strOutput = printStr(output);
  19.     System.out.println(strOutput);
    . from: 1point3acres.com/bbs
  20.     output = parseCSV("\"Alexandra \"\"Alex\"\"\",Menendez,alex.menendez@gmail.com,Miami,1");
  21.     strOutput = printStr(output);
  22.     System.out.println(strOutput);
  23.   }
  24. . Waral 鍗氬鏈夋洿澶氭枃绔,
  25.   public static ArrayList<String> parseCSV(String str) {
  26.     ArrayList<String> res = new ArrayList<String>();. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  27.     boolean inQuote = false; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  28.     StringBuilder buffer = new StringBuilder();
  29.     for(int i = 0; i < str.length(); i++) {
  30.       if(inQuote) {
  31.         if(str.charAt(i) == '"') {
  32.           if(i == str.length()-1) {
  33.             res.add(buffer.toString());
  34.             return res;. From 1point 3acres bbs
  35.           } else if(str.charAt(i+1) == '"') {
  36.             buffer.append('"');
  37.             i++;
  38.           } else {
  39.             res.add(buffer.toString());
  40.             buffer.setLength(0);
  41.             inQuote = false;
  42.             i++;
  43.           }. From 1point 3acres bbs
  44.         } else buffer.append(str.charAt(i));
  45.       } else {.1point3acres缃
  46.         if(str.charAt(i) == '"') { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  47.           inQuote = true;
  48.         } else if( str.charAt(i) == ',') { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  49.           res.add(buffer.toString());
  50.           buffer.setLength(0);
  51.         } else {
  52.           buffer.append(str.charAt(i));
  53.         }


  54.       }

  55.     }
  56.     if(buffer.length() > 0) res.add(buffer.toString());
  57.     return res;
  58.   }
  59. . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  60.   public static String printStr(ArrayList<String> list) {
  61.     StringBuilder res = new StringBuilder();
  62.     for(int i = 0; i < list.size()-1; i++) {
  63.       res.append(list.get(i));. 1point 3acres 璁哄潧
  64.       res.append('|');
  65.     } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  66.     res.append(list.get(list.size()-1));
  67.     return res.toString();
  68.   }
  69. }
复制代码
现在对这题还是有一些不太懂的地方。 这题的规则是
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呀
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

custom counter

GMT+8, 2017-9-23 20:56

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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