一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 2400|回复: 18
收起左侧

脸家店面

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

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

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

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

x
就是按格式打印json,之前用过json不记得了格式细节了,店面小哥说无所谓,就打印就可以了
http://jsonprettyprint.com/
类似这种的, 输入[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));           }              }  

-google 1point3acres
补充内容 (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}]";
  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 }";. 1point3acres.com/bbs
  5. .鏈枃鍘熷垱鑷1point3acres璁哄潧

  6.      parseJson(ss);. more info on 1point3acres.com
  7.    
  8.   }
  9.   
  10.   public static String dentSpace(int dentNum) {
  11.       int count = 0;
  12.       StringBuilder sb = new StringBuilder();
  13.         while(count < dentNum){
  14.           sb.append(" ");
  15.           count++;
  16.         }
  17.       return sb.toString();

  18. . 1point 3acres 璁哄潧
  19.   }
  20.   
  21.   public static void parseJson(String s) {
  22.       int dent = 0;
    . From 1point 3acres bbs
  23.       for(int i = 0; i < s.length(); i++) {
  24.            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
  25.              StringBuilder sb = new StringBuilder();
  26.              while(i < s.length() && (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.')){
  27.                  sb.append(s.charAt(i));
  28.                  i++;
  29.              } . visit 1point3acres.com for more.
  30.              String dents = dentSpace(dent);
  31.              System.out.print(dents + sb.toString());-google 1point3acres
  32.              i--;
  33.            }else if(s.charAt(i) == '[' || s.charAt(i) == '{'){
  34.                if(i != 0 && s.charAt(i-1) == ':'){
  35.                    dent++;-google 1point3acres
  36.                    System.out.print(s.charAt(i));. 1point3acres.com/bbs
  37.                    continue;
  38.                }

  39.             
  40.              . from: 1point3acres.com/bbs
  41.              String dents = dentSpace(dent);.1point3acres缃
  42.              dent++;
  43.              System.out.print("\n" + dents + s.charAt(i)+"\n");
  44.             
  45.            }else if (s.charAt(i) == ','){     .鏈枃鍘熷垱鑷1point3acres璁哄潧

  46.                System.out.print(s.charAt(i) + "\n");
  47.            }else if(s.charAt(i) == ']' || s.charAt(i) == '}') {
  48.               dent--;
  49.               String dents = dentSpace(dent);
  50.               if(i < s.length()-1 && s.charAt(i+1) == ',' ){
  51.                  System.out.println("\n" + dents + s.charAt(i) + ",");.1point3acres缃
  52.                  i++;
  53.               }else{
  54.                  System.out.println("\n" + dents + s.charAt(i));
  55.               }
  56.               .1point3acres缃
  57.            }else if(s.charAt(i) == '\"' ){ // new string key
  58.                StringBuilder sb2 = new StringBuilder();
  59.                sb2.append(s.charAt(i));
  60.                i++;
  61.                while(i < s.length() && s.charAt(i) != '\"'){. Waral 鍗氬鏈夋洿澶氭枃绔,
  62.                   sb2.append(s.charAt(i));
  63.                   i++;.1point3acres缃
  64.                }. more info on 1point3acres.com
  65.                sb2.append(s.charAt(i));
  66.                String dents = dentSpace(dent);
  67.                System.out.print(dents + sb2.toString());         
    . 1point 3acres 璁哄潧
  68.            }else if(s.charAt(i) == ':'){
  69.                 System.out.print(s.charAt(i));
    . 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  70.            }

  71.         
  72.       }  
复制代码
回复 支持 4 反对 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 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
已经收到拒信,哎
. visit 1point3acres.com for more.
pat pat LZ 给你加点米。还有其他的好公司的!

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

补充内容 (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.... more info on 1point3acres.com

补充内容 (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 给你加点米。还有其他的好公司的!
. 1point3acres.com/bbs
补充内容 (2016-8-23 15:38):
-google 1point3acres
谢谢鼓励~嗯,是的,因为有好几种情况. more info on 1point3acres.com
比如
123也要
. From 1point 3acres bbs[[1]]也要
虽然知道{要开始json obj, [要开始array,但是本质上感觉都要换行,然后后面的内容缩进,没看出在格式上的实质区别~. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
嗯,是的,需要和那个网站一样样式的缩进,换行
回复 支持 反对

使用道具 举报

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

补充内容 (2016-8-23 15:38):
.鐣欏璁哄潧-涓浜-涓夊垎鍦
求问什么叫不用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的 . 1point3acres.com/bbs

  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);
    . Waral 鍗氬鏈夋洿澶氭枃绔,
  9.                 int i = pos[0];
  10.                
  11.                 while (i < str.length()) {
  12.                         if (str.charAt(i) == ' ') {. more info on 1point3acres.com
  13.                                 i++;. from: 1point3acres.com/bbs
  14.                         } else {. From 1point 3acres bbs
  15.                                 char c = str.charAt(i);
  16.                                 if (c == '{' || c == '[') {
  17.                                         pos[0] = i + 1;
  18.                                         sb.append((c == '{' ? '{' : '[') + newLine + parseJson(str, pos, newLine, indent + "  ") + newLine + indent +  (c == '{' ? '}' : ']'));
  19.                                         i = pos[0] + 1;
  20.                                 } else if (c == '}' || c == ']') {
  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++;
  29.                                 }
  30.                         }.1point3acres缃
  31.                 }. 鍥磋鎴戜滑@1point 3 acres
  32.                 pos[0] = i;
  33.                 return sb.toString();-google 1point3acres
  34.         }
复制代码
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

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

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 05:07

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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