12
返回列表 发新帖
楼主: zdj0712
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 请教一道string的题T_T

🔗
ygmm 2019-3-16 14:31:50 | 只看该作者
全局:
给一个String “a{1,2}b{3,4}d”输出 a1b3d,a2b3d,a2b3d,a2b4d  这个输出例子不对,是a1b3d,a2b3d,a1b4d,a2b4d 还是 a1b3d,a1b4d,a2b3d,a2b4d?
回复

使用道具 举报

🔗
gegeyongfu 2019-3-17 06:37:56 | 只看该作者
全局:
  1. public static void generate(String s){
  2.         Deque<String> dq = new LinkedList<>();
  3.         dq.add("");
  4.         String cur = "";
  5.         for(int i = 0; i < s.length(); i++){
  6.             char c = s.charAt(i);
  7.             if (c == '{') {
  8.                 processQueue(dq, cur);
  9.                 cur = "";
  10.                 List<String> temp = brackets(s, i + 1);
  11.                 i = Integer.parseInt(temp.get(temp.size() - 1)) - 1;
  12.                 temp.remove(temp.size() - 1);
  13.                 int size = dq.size();
  14.                 while(size-- > 0){
  15.                     String prefix = dq.pollFirst();
  16.                     for(String tmp: temp){
  17.                         dq.add(prefix + tmp);
  18.                     }
  19.                 }
  20.             }else{
  21.                 cur += c;
  22.             }
  23.         }
  24.         if(cur != null){
  25.             processQueue(dq, cur);
  26.         }
  27.         while (!dq.isEmpty()) {
  28.             System.out.println(dq.poll());
  29.         }
  30.     }

  31.     public static Deque<String> processQueue(Deque<String> dq, String toBeAdded){
  32.         int size = dq.size();
  33.         while(size-- > 0){
  34.             dq.add(dq.pollFirst() + toBeAdded);
  35.         }
  36.         return dq;
  37.     }
  38.     public static List<String> brackets(String s, int start){
  39.         List<String> res = new ArrayList<>();
  40.         String cur = "";
  41.         int left = 1;
  42.         int i;
  43.         for(i = start; i < s.length() && left > 0; i++){
  44.             char c = s.charAt(i);
  45.             if(c == ','){
  46.                 res.add(cur);
  47.                 cur = "";
  48.             }else if(c == '{'){
  49.                 List<String> temp = brackets(s, i + 1);
  50.                 i = Integer.parseInt(temp.get(temp.size() - 1)) - 1;
  51.                 temp.remove(temp.size() - 1);
  52.                 res.addAll(temp);
  53.             }else if(c == '}'){
  54.                 left--;
  55.                 if(cur.length() != 0){
  56.                     res.add(cur);
  57.                     cur = "";
  58.                 }
  59.             }else{
  60.                 cur += c;
  61.             }
  62.         }
  63.         res.add(String.valueOf(i));
  64.         return res;
  65.     }
复制代码

补充内容 (2019-3-17 06:38):
java随便写了一下,确实挺长。。求点米

评分

参与人数 3大米 +9 收起 理由
lorixx + 2 给你点个赞!
zdj0712 + 2 给你点个赞!
14417335 + 5 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
imiochen24 2019-3-17 11:53:23 | 只看该作者
全局:
zdj0712 发表于 2019-3-16 13:51
这是我的错,我在整理面经,两道相似的题,但不一样的output。发的时候以为是一样的。

谢谢指出。

可以说一下面经完整题目是啥
回复

使用道具 举报

🔗
 楼主| zdj0712 2019-3-18 01:22:23 | 只看该作者
全局:
就是第一个例子是一个面经。输入输出都给了,顺序无所谓。
后面的例子是一个面经,让implement shell中{}的功能。后面的follow up是如果有nested{}怎么做。
回复

使用道具 举报

🔗
ziwei1992 2019-4-12 09:23:42 | 只看该作者
全局:
请问这题nested有没有人做出来的?写了半天写不出来。。。
回复

使用道具 举报

🔗
jaskk 2019-4-14 04:38:36 | 只看该作者
全局:
支持嵌套的Java版本
维护一个list记录已有的options, 比如a{1,2} 处理完的时候list是[a1,a2]
每次遇到bracket时候 recursive call 返回新的list, 两个list合并后size是a*b
最后join list ","

写完感觉代码可读性一般,求建议
顺便求大米
  1. import java.io.*;
  2. import java.util.*;

  3. public class ParseString{
  4.         public static void main(String[] args){
  5.                 ParseString solution = new ParseString();
  6.                 System.out.println("Input:" + "a{1,2}b{3,4}c{5,6}" +  " Result:" + solution.parseString("a{1,2}b{3,4}c{5,6}"));
  7.                 System.out.println("Input:" + "{a,b}.txt" +  " Result:" + solution.parseString("{a,b}.txt"));
  8.                 System.out.println("Input:" + "a.java,b.py,c{.java,.py}" +  " Result:" + solution.parseString("a.java,b.py,c{.java,.py}"));
  9.                 System.out.println("Input:" + "a{1,2}b{d{7,8},4}c{5,6}" +  " Result:" + solution.parseString("a{1,2}b{d{7,8},4}c{5,6}"));
  10.         }
  11.        
  12.         public String parseString(String str){
  13.                 Queue<Character> queue = new LinkedList<>();
  14.                 for(char c: str.toCharArray()){
  15.                         queue.offer(c);
  16.                 }
  17.                 List<String> res = parseBracket(queue);
  18.                 return String.join(",", res);
  19.         }
  20.        
  21.         public List<String> parseBracket(Queue<Character> queue){
  22.                 List<String> res = new ArrayList<>();
  23.                 StringBuilder sb = new StringBuilder();
  24.                 List<String> currentOptions = new ArrayList<>();
  25.                 currentOptions.add("");
  26.                 while(!queue.isEmpty()){
  27.                         Character c = queue.poll();
  28.                         if(c.equals('{')){
  29.                                 String currentString = sb.toString();
  30.                                 sb = new StringBuilder();
  31.                                 List<String> nextOptions = parseBracket(queue); // Recursive
  32.                                 List<String> next = new ArrayList<>();
  33.                                 for(String previous : currentOptions){
  34.                                         for(String option : nextOptions){
  35.                                                 next.add(previous + currentString + option);
  36.                                         }
  37.                                 }
  38.                                 currentOptions = next;
  39.                         }else if(c.equals('}') || c.equals(',')){
  40.                                 res.add(finishCurrentOption(sb, currentOptions));
  41.                                 sb = new StringBuilder();
  42.                                 currentOptions = new ArrayList<>();
  43.                                 currentOptions.add("");
  44.                                 if(c.equals('}')) return res;
  45.                         }else{
  46.                                 sb.append(c);
  47.                         }
  48.                 }
  49.                 res.add(finishCurrentOption(sb, currentOptions));
  50.                 return res;
  51.         }
  52.        
  53.         private String finishCurrentOption(StringBuilder sb, List<String> currentOptions){
  54.                 String currentString = sb.toString();
  55.                 sb = new StringBuilder();
  56.                 for(int i=0; i<currentOptions.size(); i++){
  57.                         sb.append(currentOptions.get(i));
  58.                         sb.append(currentString);
  59.                         if(i != currentOptions.size()-1) sb.append(',');
  60.                 }
  61.                 return sb.toString();
  62.         }
  63. }
复制代码

补充内容 (2019-4-14 04:40):
log:
Input:{a,b}.txt Result:a.txt,b.txt
Input:a.java,b.py,c{.java,.py} Result:a.java,b.py,c.java,c.py
Input:a{1,2}b{d{7,8},4}c{5,6} Result:a1bd7,d8c5,a1bd7,d8c6,a1b4c5,a1b4c6,a2bd7,d8c5,a2bd7,d8c6,...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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