📣 独立日限时特惠: VIP通行证立减$68
楼主: 神罗天征
跳转到指定楼层
上一主题 下一主题
收起左侧

Snapchat 面经请教

🔗
 楼主| 神罗天征 2016-11-5 04:28:38 | 只看该作者
全局:
kradnangel 发表于 2016-11-5 04:25
楼主回复好快! 但还是没太明白原题,是给string,随便加(),求max吗?。。。follow up懂了。暴力解的 ...

原题是比如1 *( 2 + (8 / 4))这种,求结果,计算任意两个数字之间的结果是O(n ^ 3)吧,或者你是说先用dp去计算两个数字之间的结果?

补充内容 (2016-11-5 04:30):
follow up 是给你2 * 1 + 3 + 4,问你怎么加一对括号,使它的值最大, 比如这个应该是 2 * (1 + 3 + 4), 这样值是最大的,为16
回复

使用道具 举报

🔗
kradnangel 2016-11-5 04:38:20 | 只看该作者
全局:
神罗天征 发表于 2016-11-5 04:28
原题是比如1 *( 2 + (8 / 4))这种,求结果,计算任意两个数字之间的结果是O(n ^ 3)吧,或者你是说先 ...

喔喔,那原题就是stack做就好了吧。任意两个数字之间的和,也是DP做。先预处理任意区间内+-的位置,for 间隔, for 左边index(i),右边index(j)就是左index + 间隔。然后计算的话,就是这个区间内任意一个+-位置的左边+-右边。如果没有+-就直接 a[i][j] = a[i][j-1] */ number[j] 就好了。这样应该就能O(N^2)了吧。
回复

使用道具 举报

🔗
 楼主| 神罗天征 2016-11-5 04:58:58 | 只看该作者
全局:
kradnangel 发表于 2016-11-5 04:38
喔喔,那原题就是stack做就好了吧。任意两个数字之间的和,也是DP做。先预处理任意区间内+-的位置,for ...

考完试再看看😂😂
回复

使用道具 举报

🔗
kradnangel 2016-11-5 05:11:51 | 只看该作者
全局:
神罗天征 发表于 2016-11-5 04:58
考完试再看看😂😂

楼主几号onsite?
回复

使用道具 举报

🔗
 楼主| 神罗天征 2016-11-5 05:13:11 | 只看该作者
全局:

都还没电面。。。
回复

使用道具 举报

全局:
这题现在有DP解么? 感觉Brute Force已是最优?
回复

使用道具 举报

🔗
 楼主| 神罗天征 2016-11-9 13:11:30 | 只看该作者
全局:
小A要当码农 发表于 2016-11-9 11:33
这题现在有DP解么? 感觉Brute Force已是最优?

同感……
回复

使用道具 举报

🔗
geng77 2016-11-10 00:33:07 | 只看该作者
全局:
发一个我对第一问的DP解法, 思想是dp[i][j] = max(dp[i][k] operator[k] dp[k][j])
  public int maxValue(String input){
    if(input == null || input.length() == 0){
      return 0;
    }
    ArrayList<Integer> operands = new ArrayList<>();
    ArrayList<Character> operators = new ArrayList<>();
    int number = 0;
    for(int i = 0; i < input.length(); i++) {
      if (Character.isDigit(input.charAt(i))) {
        number = number * 10 + input.charAt(i) - '0';
      } else {
        operands.add(number);
        number = 0;
        operators.add(input.charAt(i));
      }
    }
    operands.add(number);

    int[][] dp = new int[operands.size()][operands.size()];
    for(int i = 0; i < operands.size(); i++){
      dp[i][i] = operands.get(i);
      if(i < operands.size() - 1) {
        dp[i][i + 1] = compute(operands.get(i), operands.get(i + 1), operators.get(i));
      }
    }

    for(int left = 0; left < operands.size(); left++){
      for(int right = left + 2; right < operands.size(); right++){
        for(int k = left + 1; k <= right; k++){
          if(operators.get(k - 1) == '/' && dp[k][right] == 0){
            continue;
          }
          dp[left][right] = Math.max(dp[left][right], compute(dp[left][k - 1], dp[k][right], operators.get(k - 1)));
        }
      }
    }
    return dp[0][operands.size()-1];
  }
回复

使用道具 举报

🔗
 楼主| 神罗天征 2016-11-10 01:58:02 | 只看该作者
全局:
geng77 发表于 2016-11-10 00:33
发一个我对第一问的DP解法, 思想是dp[j] = max(dp[k] operator[k] dp[k][j])
  public int maxValue(Stri ...

请问你这个的思路是什么呢?时间复杂度看起来好像也是n^3, 是吗
回复

使用道具 举报

🔗
geng77 2016-11-10 05:53:27 | 只看该作者
全局:
神罗天征 发表于 2016-11-10 01:58
请问你这个的思路是什么呢?时间复杂度看起来好像也是n^3, 是吗

是的,就是把每个操作符当成是最后一次运算的符号,然后依次迭代左边和右边。
就是 input[0...k] op input[k..n]
回复

使用道具 举报

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

本版积分规则

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