楼主: norafang
跳转到指定楼层
上一主题 下一主题
收起左侧

Twitter电面

🔗
 楼主| norafang 2016-3-24 09:14:07 | 只看该作者
全局:
Dream_Hunter 发表于 2016-3-24 08:20
就是当栈为空的时候。如果发现是“(”就push进去。如果是“)”就不做处理,顺便把当前长度改为0.
其次 ...

比如说(())和()()这两种情况的话,后一种用这个方法输出的就是()(),那前一种第二次pop“(”的时候你怎么知道他是在第一次pop出来的“(”前面push进去的而不是后来push进去的呢?

补充内容 (2016-3-24 09:19):
不知道有没有表达清楚,就是括号输出也要按照顺序,"(()())"的话输出也要是"(()())"而不能是“()()()”
回复

使用道具 举报

🔗
Dream_Hunter 2016-3-24 09:29:08 | 只看该作者
全局:
norafang 发表于 2016-3-24 09:14
比如说(())和()()这两种情况的话,后一种用这个方法输出的就是()(),那前一种第二次pop“(”的时候你怎 ...

def longestSubsequence(s):
     #use stack and a int to record maxlength
     #if the stack append again, we need to recalculate the maxlength
    maxlength = 0
    length = 0
    stack = []
    rs = ""
    maxrs = ""
    for c in s:
        if not stack:
            if c ==")":
                length = 0
                rs = ""
            else:
                stack.append(c)
                rs +="("
        else:
            if c == "(":
                stack.append(c)
                rs +="("
            else:
                if stack.pop() == "(":
                    length +=2
                    rs +=")"
                # else:
                #     length = 0
        if len(maxrs)<len(rs):
            maxrs = rs
        if maxlength<length:
            maxlength = length
    return maxlength,maxrs

print longestSubsequence("())()()")

sorry我题目看错了。。其实道理一样。你可以用一个string来记录当前走过的parenthesis。然后判断stirng的长度,保留长度最长那个。这样其实就不用maxlength了。。我一直以为是要求最大长度。
回复

使用道具 举报

🔗
jiebour 2016-3-25 11:38:43 | 只看该作者
全局:
求问楼主是什么职位?多谢!
回复

使用道具 举报

🔗
 楼主| norafang 2016-3-26 22:22:25 | 只看该作者
全局:
jiebour 发表于 2016-3-25 11:38
求问楼主是什么职位?多谢!

SWE, entry level role
回复

使用道具 举报

🔗
sealove999 2016-3-27 01:55:42 | 只看该作者
全局:
楼主是这个代码的意思么


  1. public class Solution {
  2.   public String findLongestWellFormatedSubstring(String s) {
  3.     String ret = "";
  4.     Deque<Integer> stack = new ArrayDeque<>();
  5.     for (int i = 0; i < s.length(); i++) {
  6.       if (s.charAt(i) == '(') {
  7.         stack.push(i);
  8.       } else if (s.charAt(i) == ')') {
  9.         if (!stack.isEmpty() && s.charAt(stack.peek()) == '(') {
  10.           stack.pop();
  11.           int idx = stack.isEmpty() ? -1 : stack.peek();
  12.           if (i - idx > ret.length()) {
  13.             ret = s.substring(idx + 1, i + 1);
  14.           }
  15.         }
  16.       }
  17.     }
  18.     return ret;
  19.   }

  20.   public int findLongestWellFormatedSubstringLength(String s) {
  21.     int ret = 0;
  22.     Deque<Integer> stack = new ArrayDeque<>();
  23.     for (int i = 0; i < s.length(); i++) {
  24.       if (s.charAt(i) == '(') {
  25.         stack.push(i);
  26.       } else if (s.charAt(i) == ')') {
  27.         if (!stack.isEmpty() && s.charAt(stack.peek()) == '(') {
  28.           stack.pop();
  29.           ret = Math.max(ret, i - (stack.isEmpty() ? -1 : stack.peek()));
  30.         }
  31.       }
  32.     }
  33.     return ret;
  34.   }

  35.   public static void main(String[] args) {
  36.     Solution ss = new Solution();
  37.     String s = "((()())";
  38.     System.out.println(ss.findLongestWellFormatedSubstringLength(s));
  39.     System.out.println(ss.findLongestWellFormatedSubstring(s));
  40.   }
  41. }
复制代码
回复

使用道具 举报

🔗
sealove999 2016-3-27 02:03:06 | 只看该作者
全局:
sealove999 发表于 2016-3-27 01:55
楼主是这个代码的意思么

刚才那个是错的,看这个
  1. public class Solution {
  2.   public String findLongestWellFormatedSubstring(String s) {
  3.     String ret = "";
  4.     Deque<Integer> stack = new ArrayDeque<>();
  5.     for (int i = 0; i < s.length(); i++) {
  6.       if (s.charAt(i) == ')' && (!stack.isEmpty() && s.charAt(stack.peek()) == '(')) {
  7.         stack.pop();
  8.         int idx = stack.isEmpty() ? -1 : stack.peek();
  9.         if (i - idx > ret.length()) {
  10.           ret = s.substring(idx + 1, i + 1);
  11.         }
  12.       } else {
  13.         stack.push(i);
  14.       }
  15.     }
  16.     return ret;
  17.   }

  18.   public int findLongestWellFormatedSubstringLength(String s) {
  19.     int ret = 0;
  20.     Deque<Integer> stack = new ArrayDeque<>();
  21.     for (int i = 0; i < s.length(); i++) {
  22.       if (s.charAt(i) == '(') {
  23.         stack.push(i);
  24.       } else if (s.charAt(i) == ')') {
  25.         if (!stack.isEmpty() && s.charAt(stack.peek()) == '(') {
  26.           stack.pop();
  27.           ret = Math.max(ret, i - (stack.isEmpty() ? -1 : stack.peek()));
  28.         } else {
  29.           stack.push(i);
  30.         }
  31.       }
  32.     }
  33.     return ret;
  34.   }

  35.   public static void main(String[] args) {
  36.     Solution ss = new Solution();
  37.     String s = ")(()())";
  38.     System.out.println(ss.findLongestWellFormatedSubstringLength(s));
  39.     System.out.println(ss.findLongestWellFormatedSubstring(s));
  40.   }
  41. }
复制代码
回复

使用道具 举报

🔗
 楼主| norafang 2016-3-29 02:11:04 | 只看该作者
全局:
sealove999 发表于 2016-3-27 02:03
刚才那个是错的,看这个

不是求最长substring是最长subsequence, 所以()))(()()) 的话要返回()(()())
回复

使用道具 举报

🔗
sealove999 2016-3-29 03:24:18 | 只看该作者
全局:
norafang 发表于 2016-3-29 02:11
不是求最长substring是最长subsequence, 所以()))(()()) 的话要返回()(()())

楼主好棒
  1. public class Solution {
  2.   public String findLongestWellFormatedSubstring(String s) {
  3.     StringBuilder sb = new StringBuilder();
  4.     String ret = "";
  5.     Deque<Integer> stack = new ArrayDeque<>();
  6.     for (int i = 0; i < s.length(); i++) {
  7.       if (s.charAt(i) == ')' && (!stack.isEmpty() && s.charAt(stack.peek()) == '(')) {
  8.         stack.pop();
  9.         int idx = stack.isEmpty() ? -1 : stack.peek();
  10.         if (i - idx > ret.length()) {
  11.           ret = s.substring(idx + 1, i + 1); // current longest substring
  12.         }
  13.       } else {
  14.         stack.push(i);
  15.         if (s.charAt(i) == ')') {
  16.           sb.append(ret); // invalid
  17.           ret = "";
  18.         }
  19.       }
  20.     }
  21.     sb.append(ret); // last
  22.     return sb.toString();
  23.   }

  24.   public static void main(String[] args) {
  25.     Solution ss = new Solution();
  26.     String s = "()))(()())";
  27.     System.out.println(ss.findLongestWellFormatedSubstring(s));
  28.   }
  29. }
复制代码
回复

使用道具 举报

🔗
Dream_Hunter 2016-3-29 04:08:15 | 只看该作者
全局:
最长subsequence不是连续的也可以的喽?每次合法的都得加上去?
回复

使用道具 举报

🔗
 楼主| norafang 2016-4-2 07:32:39 | 只看该作者
全局:
Dream_Hunter 发表于 2016-3-29 04:08
最长subsequence不是连续的也可以的喽?每次合法的都得加上去?

是的~~~~~~~~~~
回复

使用道具 举报

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

本版积分规则

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