《数据科学面试40+真题讲解》,K神本年度最后一次开课


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 5415|回复: 19
收起左侧

脸家店面

[复制链接] |试试Instant~ |关注本帖
pinkdatura 发表于 2016-8-21 01:54:01 | 显示全部楼层 |阅读模式

2016(7-9月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 |Otherfresh grad应届毕业生

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

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

x
就是按格式打印json,之前用过json不记得了格式细节了,店面小哥说无所谓,就打印就可以了
http://jsonprettyprint.com/. 鍥磋鎴戜滑@1point 3 acres
类似这种的, 输入[1,2,3, {"id": 1, "name": "wang", "tag":[1,"home",2], "price":234}]
要求打出来这个
[  1,  2,  3,  {    "id": 1,    "name": "wang",    "tag": [      1,      "home",      2    ],    "price": 234  }]
因为对格式不熟悉,也没敢用recursive就直接iterative写了,感觉不太好,准备了这么久好多高级算法也学了,题也做了好多,可是需要种新题目还是蒙。求问大家如何用递归比较好,现在直到{}是json object就是key value pair, key是string, value是啥都行(数组,数字,json obj, ...)[]是json array里面也啥都可以,如何有效的用递归呢?是遇到[递归还是遇到{递归呢,目测没发现这两种情况在打印上有区别(是print不是parse附上我写的ugly程序public class parseJoson {  public static void main(String [] args) {      String s = "[1,2,3, {\"id\": 1, \"name\": \"wang\", \"tag\":[1,\"home\",2], \"price\":234}]";     String ss = "{ \"firstName\": \"John\", \"lastName\": \"Smith\", \"isAlive\": true, \"age\": 25, \"address\": { \"streetAddress\": \"21 2nd Street\", \"city\": \"New York\", \"state\": \"NY\", \"postalCode\": \"10021-3100\" }, \"phoneNumbers\": [ { \"type\": \"home\", \"number\": \"212 555-1234\" }, { \"type\": \"office\", \"number\": \"646 555-4567\" }, { \"type\": \"mobile\", \"number\": \"123 456-7890\" } ], \"children\": [], \"spouse\": nul }";      parseJson(ss);      }     public static String dentSpace(int dentNum) {      int count = 0;      StringBuilder sb = new StringBuilder();        while(count < dentNum){          sb.append(" ");          count++;        }       return sb.toString();  }    public static void parseJson(String s) {      int dent = 0;      for(int i = 0; i < s.length(); i++) {           if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){             StringBuilder sb = new StringBuilder();             while(i < s.length() && (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.')){                 sb.append(s.charAt(i));                 i++;             }              String dents = dentSpace(dent);             System.out.print(dents + sb.toString());             i--;           }else if(s.charAt(i) == '[' || s.charAt(i) == '{'){               if(i != 0 && s.charAt(i-1) == ':'){                   dent++;                   System.out.print(s.charAt(i));                   continue;               }                                      String dents = dentSpace(dent);             dent++;             System.out.print("\n" + dents + s.charAt(i)+"\n");                        }else if (s.charAt(i) == ','){                    System.out.print(s.charAt(i) + "\n");           }else if(s.charAt(i) == ']' || s.charAt(i) == '}') {              dent--;              String dents = dentSpace(dent);              if(i < s.length()-1 && s.charAt(i+1) == ',' ){                 System.out.println("\n" + dents + s.charAt(i) + ",");                 i++;              }else{                 System.out.println("\n" + dents + s.charAt(i));              }                         }else if(s.charAt(i) == '\"' ){ // new string key               StringBuilder sb2 = new StringBuilder();               sb2.append(s.charAt(i));               i++;               while(i < s.length() && s.charAt(i) != '\"'){                  sb2.append(s.charAt(i));                  i++;               }               sb2.append(s.charAt(i));               String dents = dentSpace(dent);               System.out.print(dents + sb2.toString());                    }else if(s.charAt(i) == ':'){                System.out.print(s.charAt(i));           }              }  


补充内容 (2016-8-21 01:55):
程序格式没弄好~

评分

3

查看全部评分

 楼主| pinkdatura 发表于 2016-8-21 01:55:21 | 显示全部楼层
  1. public class parseJoson {
  2.   public static void main(String [] args) {
  3.       String s = "[1,2,3, {\"id\": 1, \"name\": \"wang\", \"tag\":[1,\"home\",2], \"price\":234}]";. From 1point 3acres bbs
  4.      String ss = "{ \"firstName\": \"John\", \"lastName\": \"Smith\", \"isAlive\": true, \"age\": 25, \"address\": { \"streetAddress\": \"21 2nd Street\", \"city\": \"New York\", \"state\": \"NY\", \"postalCode\": \"10021-3100\" }, \"phoneNumbers\": [ { \"type\": \"home\", \"number\": \"212 555-1234\" }, { \"type\": \"office\", \"number\": \"646 555-4567\" }, { \"type\": \"mobile\", \"number\": \"123 456-7890\" } ], \"children\": [], \"spouse\": nul }";


  5.      parseJson(ss);
  6.    
  7.   } . from: 1point3acres.com/bbs
  8.   -google 1point3acres
  9.   public static String dentSpace(int dentNum) {
  10.       int count = 0;
  11.       StringBuilder sb = new StringBuilder();
  12.         while(count < dentNum){
  13.           sb.append(" ");
  14.           count++;. 鍥磋鎴戜滑@1point 3 acres
  15.         } . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  16.       return sb.toString();

  17.   }. more info on 1point3acres.com
  18.   
  19.   public static void parseJson(String s) {. 1point 3acres 璁哄潧
  20.       int dent = 0;
  21.       for(int i = 0; i < s.length(); i++) {
  22.            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
  23.              StringBuilder sb = new StringBuilder();
  24.              while(i < s.length() && (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.')){
  25.                  sb.append(s.charAt(i));
  26.                  i++; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  27.              } . 1point 3acres 璁哄潧
  28.              String dents = dentSpace(dent);
  29.              System.out.print(dents + sb.toString());
  30.              i--;
  31.            }else if(s.charAt(i) == '[' || s.charAt(i) == '{'){.1point3acres缃
  32.                if(i != 0 && s.charAt(i-1) == ':'){-google 1point3acres
  33.                    dent++;
  34.                    System.out.print(s.charAt(i));. Waral 鍗氬鏈夋洿澶氭枃绔,
  35.                    continue;
  36.                }
  37. . more info on 1point3acres.com
  38.             
  39.              . 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  40.              String dents = dentSpace(dent);
  41.              dent++;
  42.              System.out.print("\n" + dents + s.charAt(i)+"\n");
  43.             
  44.            }else if (s.charAt(i) == ','){     

  45.                System.out.print(s.charAt(i) + "\n");
  46.            }else if(s.charAt(i) == ']' || s.charAt(i) == '}') {
  47.               dent--;
  48.               String dents = dentSpace(dent);
  49.               if(i < s.length()-1 && s.charAt(i+1) == ',' ){
  50.                  System.out.println("\n" + dents + s.charAt(i) + ",");
  51.                  i++;
  52.               }else{
  53.                  System.out.println("\n" + dents + s.charAt(i));
  54.               }. 1point 3acres 璁哄潧
  55.               
    . 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  56.            }else if(s.charAt(i) == '\"' ){ // new string key
  57.                StringBuilder sb2 = new StringBuilder();
  58.                sb2.append(s.charAt(i));
  59.                i++;
  60.                while(i < s.length() && s.charAt(i) != '\"'){
  61.                   sb2.append(s.charAt(i));.鐣欏璁哄潧-涓浜-涓夊垎鍦
  62.                   i++;
  63.                }
  64.                sb2.append(s.charAt(i));
  65.                String dents = dentSpace(dent);
  66.                System.out.print(dents + sb2.toString());         
  67.            }else if(s.charAt(i) == ':'){
  68.                 System.out.print(s.charAt(i));. 鍥磋鎴戜滑@1point 3 acres
  69.            }

  70.         
  71.       }  
复制代码
回复 支持 4 反对 0

使用道具 举报

野生的皮皮鲁 发表于 2017-1-12 11:02:18 | 显示全部楼层
楼主看这样行不-google 1point3acres

  1.     public static String pretty(String s) {
  2.         StringBuilder sb = new StringBuilder();
    . visit 1point3acres.com for more.
  3.         int indent = 0;
  4.         char pre = 0;
  5.         for (char c : s.toCharArray()) {
  6.             if (Character.isWhitespace(c)) continue;
  7.             if (c == ']' || c == '}') indent--;
  8.             if (pre == '[' || pre == '{' || pre == ',' || c == ']' || c == '}') {
  9.                 sb.append('\n');
  10.                 for (int i = 0; i < indent; i++) sb.append("  ");
  11.             }      
  12.             sb.append(c);
  13.             if (c == '[' || c == '{') indent++;. 1point3acres.com/bbs
  14.             pre = c;.1point3acres缃
  15.         }      
  16.         return sb.toString();. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  17.     }
复制代码
回复 支持 2 反对 0

使用道具 举报

knight0clk 发表于 2016-11-8 21:41:57 | 显示全部楼层
楼主,感觉这个题用stack存储括号,然后进而控制缩紧比较简单一些吧?然后处理一个打印一行,这样一行一行的来
回复 支持 1 反对 0

使用道具 举报

edyyy 发表于 2016-8-21 02:10:25 | 显示全部楼层
谢谢楼主分享!请问楼主面的是什么职位啊,我都没有准备json
回复 支持 反对

使用道具 举报

 楼主| pinkdatura 发表于 2016-8-22 03:29:37 | 显示全部楼层
edyyy 发表于 2016-8-21 02:10
谢谢楼主分享!请问楼主面的是什么职位啊,我都没有准备json

就是普通的software engineer,不用准备json也行,面试官会给你大概讲解一下json的格式的,哎,刷了那么多题目可能还是自己基础不扎实。
回复 支持 反对

使用道具 举报

求内退求offer 发表于 2016-8-22 10:50:36 | 显示全部楼层
不太明白输入的意思
输入[1,2,3, {"id": 1, "name": "wang", "tag":[1,"home",2], "price":234}]中1,2,3是什么?
回复 支持 反对

使用道具 举报

 楼主| pinkdatura 发表于 2016-8-23 01:39:28 | 显示全部楼层
求内退求offer 发表于 2016-8-22 10:50
不太明白输入的意思
输入[1,2,3, {"id": 1, "name": "wang", "tag":[1,"home",2], "price":234}]中1,2,3 ...

也是json object啊,就是打印就可以了。
回复 支持 反对

使用道具 举报

 楼主| pinkdatura 发表于 2016-8-23 01:40:04 | 显示全部楼层
已经收到拒信,哎
回复 支持 反对

使用道具 举报

stephaniede 发表于 2016-8-24 06:26:52 | 显示全部楼层
pinkdatura 发表于 2016-8-22 10:40
已经收到拒信,哎

pat pat LZ 给你加点米。还有其他的好公司的!. 1point3acres.com/bbs

补充内容 (2016-8-23 15:38):
LZ, 这道题是要output成 prettyJson那种格式的吗?和你给的那个网站parse出一摸一样的?
这题用Javascript写估计沾光啊。记得有个Object.Stringfy()。。 哎要是我也遇到应该也会慌,虽然我写iOS经常处理json. Waral 鍗氬鏈夋洿澶氭枃绔,

补充内容 (2016-8-23 15:58):
str.replace(/\\/, "");
console.log(str);  两行就输出了JSON所有内容。{ "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "N...

补充内容 (2016-8-23 21:59):
多谢LZ提示,这道题可以不用stringBuilder,反复叠加当前字符,然后遇到[和{或者,的时候进行换行增加新行indent,遇到]和}的时候减少indent ,换行用'\n'。最后输出result string
回复 支持 反对

使用道具 举报

 楼主| pinkdatura 发表于 2016-8-24 07:00:10 | 显示全部楼层
stephaniede 发表于 2016-8-24 06:26
pat pat LZ 给你加点米。还有其他的好公司的!

补充内容 (2016-8-23 15:38):

谢谢鼓励~嗯,是的,因为有好几种情况
比如
123也要
[[1]]也要
虽然知道{要开始json obj, [要开始array,但是本质上感觉都要换行,然后后面的内容缩进,没看出在格式上的实质区别~
嗯,是的,需要和那个网站一样样式的缩进,换行
回复 支持 反对

使用道具 举报

处川 发表于 2016-9-23 02:39:16 | 显示全部楼层
stephaniede 发表于 2016-8-24 06:26
pat pat LZ 给你加点米。还有其他的好公司的!

补充内容 (2016-8-23 15:38):
.鏈枃鍘熷垱鑷1point3acres璁哄潧
求问什么叫不用stringbuilder 反复叠加当前字符,没听懂啊,谢谢啊
回复 支持 反对

使用道具 举报

stephaniede 发表于 2016-9-23 02:42:56 | 显示全部楼层
处川 发表于 2016-9-22 11:39
求问什么叫不用stringbuilder 反复叠加当前字符,没听懂啊,谢谢啊

我的意思是可以用StringBuilder, 直接用String + String的方法更方便不是么,Stringbuilder都要loop啊
回复 支持 反对

使用道具 举报

liurudahai 发表于 2016-9-28 11:45:17 | 显示全部楼层
你这个输入不是已经是KEY VALUE PAIR了么,没看懂输入输出的区别
回复 支持 反对

使用道具 举报

 楼主| pinkdatura 发表于 2016-11-10 04:03:13 | 显示全部楼层
knight0clk 发表于 2016-11-8 21:41
楼主,感觉这个题用stack存储括号,然后进而控制缩紧比较简单一些吧?然后处理一个打印一行,这样一行一行 ...

有两种括号,你说的哪种?
回复 支持 反对

使用道具 举报

knight0clk 发表于 2016-11-10 09:30:19 | 显示全部楼层
pinkdatura 发表于 2016-11-10 04:03. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
有两种括号,你说的哪种?

两种括号都存储,参加匹配
回复 支持 反对

使用道具 举报

pancymon 发表于 2016-11-15 07:40:29 | 显示全部楼层
楼主现在有offer了吗? 我刷的题也不够多 新题直接跪
回复 支持 反对

使用道具 举报

yuranrobin 发表于 2016-11-29 14:31:11 | 显示全部楼层
自己写了一个DFS的

  1. public static String parseJson(String str) { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  2.                 int[] pos = new int[1]; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  3.                 return parseJson(str, pos, "\n", "");
  4.         }
  5.        
  6.         private static String parseJson(String str, int[] pos, String newLine, String indent) {
  7.                 StringBuilder sb = new StringBuilder();
  8.                 sb.append(indent);
  9.                 int i = pos[0];
  10.                 . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  11.                 while (i < str.length()) {
  12.                         if (str.charAt(i) == ' ') {
  13.                                 i++;
  14.                         } else {
  15.                                 char c = str.charAt(i);. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  16.                                 if (c == '{' || c == '[') {
  17.                                         pos[0] = i + 1;.鏈枃鍘熷垱鑷1point3acres璁哄潧
  18.                                         sb.append((c == '{' ? '{' : '[') + newLine + parseJson(str, pos, newLine, indent + "  ") + newLine + indent +  (c == '{' ? '}' : ']'));. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  19.                                         i = pos[0] + 1;
  20.                                 } else if (c == '}' || c == ']') {. from: 1point3acres.com/bbs
  21.                                         pos[0] = i;
  22.                                         return sb.toString();
  23.                                 } else if (c == ',') {
  24.                                         sb.append(c + newLine + indent);
  25.                                         i++;
  26.                                 } else {
  27.                                         sb.append(c);
  28.                                         i++;.鏈枃鍘熷垱鑷1point3acres璁哄潧
  29.                                 }. more info on 1point3acres.com
  30.                         }
  31.                 }
  32.                 pos[0] = i;
  33.                 return sb.toString();
  34.         }
复制代码
回复 支持 反对

使用道具 举报

dexter 发表于 2016-11-29 14:40:22 | 显示全部楼层
yuranrobin 发表于 2016-11-29 14:31
自己写了一个DFS的

楼上好厉害~
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

custom counter

GMT+8, 2017-11-22 09:53

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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