查看: 2742| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

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

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 14417335 于 2019-3-17 21:41 编辑

您好!
本帖隐藏的内容需要积分高于 150 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 150 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

评分

参与人数 1大米 +20 收起 理由
14417335 + 20 见过多次。奖励LC没有的高频题

查看全部评分


上一篇:面试时希望碰到简单题还是难题
下一篇:大家,没面试的时候如何鼓励自己? 来点过来人吧救救孩子
 楼主| zdj0712 2019-3-18 01:22:23 | 只看该作者
全局:
就是第一个例子是一个面经。输入输出都给了,顺序无所谓。
后面的例子是一个面经,让implement shell中{}的功能。后面的follow up是如果有nested{}怎么做。
回复

使用道具 举报

推荐
風行烈 2019-3-16 10:10:01 | 只看该作者
全局:
def parseStr(s):
        finalResult = ''
        result = ['']
        inBrace = False
        currentWord = ''
        currentQueue = []
        for i in s:
                if i is '{':
                        inBrace = True       
                elif i is '}':
                        inBrace = False
                        currentQueue.append(currentWord)
                        currentWord = ''       
                        result = [ a + b for b in currentQueue for a in result]
                        currentQueue = []
                elif i is ',' and inBrace:
                        currentQueue.append(currentWord)
                        currentWord = ''       
                elif i is ',':
                        result = [ a + i for a in result]
                        finalResult = finalResult+ ','.join(result)
                        result = ['']
                else:
                        if not inBrace:
                                result = [ a + i for a in result]
                        else:
                                currentWord += i       
        return finalResult+ ','.join(result)

print parseStr('a{1,2}b{2,3}c')
print parseStr('a{.py,.java}')
print parseStr('a.java,b.py,c{.java,.py}')
print parseStr('a.java,b.py,c{.java,.py},d{.java,.py}')

如果沒有nested braces的話, 可以直接用iteration做.

所有在{}裏面的東西可以split with ','
然後把它們放到list裏, 接著就把它們append to previous result 1 by 1.



补充内容 (2019-3-16 10:10):
求大米!!

评分

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

查看全部评分

回复

使用道具 举报

推荐
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,...
回复

使用道具 举报

推荐
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 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| zdj0712 2019-3-16 10:58:32 | 只看该作者
全局:
KaWing 发表于 2019-3-16 10:10
def parseStr(s):
        finalResult = ''
        result = ['']

超级感谢!!先试着加个大米先
回复

使用道具 举报

🔗
 楼主| zdj0712 2019-3-16 12:37:39 | 只看该作者
全局:
报告一下,print parseStr('a.java,c{.java,.py}',b.py)中间会多个‘,’
我改了一下:
elif i is ',':
                        result = [ a + i for a in result]
                        finalResult = finalResult+ ''.join(result)
                        result = ['']

非常感谢啊 python真的挺方便
回复

使用道具 举报

🔗
chore 2019-3-16 12:38:52 | 只看该作者
全局:
现在流行用Python刷题?
回复

使用道具 举报

🔗
風行烈 2019-3-16 13:33:16 | 只看该作者
全局:
chore 发表于 2019-3-16 12:38
现在流行用Python刷题?

不建議在Algorithm比賽中用python, 但面試時用python通常會比較方便. 至少寫得比較少....
回复

使用道具 举报

🔗
 楼主| zdj0712 2019-3-16 13:43:12 | 只看该作者
全局:
我就是用c++做的,代码最后写晕了
follow up确实还有nested {}。。。
回复

使用道具 举报

🔗
imiochen24 2019-3-16 13:43:26 | 只看该作者
全局:
  1. def parse_string(string):
  2.     def find_sub(s, i) -> List[str]:
  3.         sub = ''
  4.         while i < len(s) and '}' not in sub:
  5.             sub += s[i]
  6.             i += 1
  7.         return sub[:-1].split(','), i - 1
  8.     if not string: return []
  9.     prefix, res = '', ['']
  10.     index = 0
  11.     while index < len(string):
  12.         if string[index] == '{':
  13.             sub, index = find_sub(string, index + 1)
  14.             res = [i + j for i in res for j in sub]
  15.         else:
  16.             res = [i + string[index] for i in res]
  17.         index += 1
  18.     return res
复制代码



看在我半夜還在打code的份上, 給點米吧

补充内容 (2019-3-16 13:46):
string “a{1,2}b{3,4}d” 應該是输出 ["a1b3d","a2b3d","a1b4d","a2b4d"]?
a.java,b.py,c{.java,.py}, 它应该输出的是 ["a.java,b.py,c.java", "a.java,b.py,c.py"]?

评分

参与人数 3大米 +10 收起 理由
esthertseng + 3 很有用的信息!
14417335 + 5 给你点个赞!
zdj0712 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| zdj0712 2019-3-16 13:51:15 | 只看该作者
全局:
imiochen24 发表于 2019-3-16 13:43
[mw_shl_code=python,true]def parse_string(string):
    def find_sub(s, i) -> List[str]:
        su ...

这是我的错,我在整理面经,两道相似的题,但不一样的output。发的时候以为是一样的。

谢谢指出。
回复

使用道具 举报

🔗
anonydieyoung 2019-3-16 14:03:43 | 只看该作者
全局:
chore 发表于 2019-3-16 12:38
现在流行用Python刷题?

onsite必备
回复

使用道具 举报

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

本版积分规则

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