一亩三分地论坛

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

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

FB第一轮面试

[复制链接] |试试Instant~ |关注本帖
tigerbro 发表于 2016-2-21 00:00:08 | 显示全部楼层 |阅读模式

2016(1-3月) 码农类 硕士 全职@Facebook - 猎头 - 技术电面 |Pass在职跳槽

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

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

x
给一个正数n,打印出所有相加的组合
. Waral 鍗氬鏈夋洿澶氭枃绔,例如10可以打印出
1+1+1+...1
1+2+1+...1
..
9+1
10

在本论坛得到帮助不少,希望onsite能顺利

评分

1

查看全部评分

本帖被以下淘专辑推荐:

duduhaha 发表于 2016-2-21 03:50:43 | 显示全部楼层
输入是10的话,楼主这题 "9 + 1" 和 " 1 + 9"应该只能输出一个吧?
回复 支持 反对

使用道具 举报

 楼主| tigerbro 发表于 2016-2-21 04:22:49 | 显示全部楼层
duduhaha 发表于 2016-2-21 03:50
输入是10的话,楼主这题 "9 + 1" 和 " 1 + 9"应该只能输出一个吧?

对,不能重复
回复 支持 反对

使用道具 举报

beer 发表于 2016-2-28 00:37:30 | 显示全部楼层
这个是Combination Sum 的变种嘛?初始化set {1,2,...,n}, 用DFS一层一层搜。
回复 支持 反对

使用道具 举报

 楼主| tigerbro 发表于 2016-2-28 03:19:39 | 显示全部楼层
beer 发表于 2016-2-28 00:37
这个是Combination Sum 的变种嘛?初始化set {1,2,...,n}, 用DFS一层一层搜。

没错,很像,简单些
回复 支持 反对

使用道具 举报

xiaohui5319 发表于 2016-3-24 10:01:33 | 显示全部楼层
void printAllCombinations(int target, string path, vector<string>& paths, vector<int>& candidates, int startPos) {
  if (target == 0) { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
    cout << path.substr(1) << endl;
    paths.push_back(path);
  }
  for (int i = startPos; i < candidates.size(); i++) {
    if (candidates[i] > target) break; //reach a candidate that is bigger than target
    printAllCombinations(target - candidates[i], path + "+" + to_string(candidates[i]), paths, candidates, i);. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  }
}

int main() {
  int n = 10;. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  vector<string> paths;
  vector<int> candidates;
  for (int i = 1; i <= n; i++) candidates.push_back(i);
  int startPos = 0; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  printAllCombinations(n, "", paths, candidates, startPos);
}
回复 支持 反对

使用道具 举报

mingzhou1987 发表于 2016-3-24 14:51:23 | 显示全部楼层
没有重复的版本。
void dfs(int step, string curStr, int curSum, int target)
{
        if (curSum > target)return;
        if (curSum == target)
        {
                curStr.pop_back(); //pop out last '+'
                cout << curStr << endl;
        }
        for (int i = step; i <= target; i++). visit 1point3acres.com for more.
        {
                if (i == target && curSum == 0). 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
                {
                        cout << i << endl;.鏈枃鍘熷垱鑷1point3acres璁哄潧
                }
                else
                {. 鍥磋鎴戜滑@1point 3 acres
                        dfs(i, curStr + to_string(i) + '+', curSum + i, target);
                }
        }
}
回复 支持 反对

使用道具 举报

sealove999 发表于 2016-4-12 15:29:55 | 显示全部楼层
  1. public class Solution {
  2.   public List<List<Integer>> expression(int n, int startpos) {
  3.     List<List<Integer>> ret = new ArrayList<>();. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  4.     if (n == 0) {
  5.       List<Integer> list = new ArrayList<>();
  6.       ret.add(list);
  7.       return ret;-google 1point3acres
  8.     }
  9.     for (int i = startpos; i <= n; i++) {
  10.       List<List<Integer>> r = expression(n - i, i);
  11.       if (!r.isEmpty()) {
  12.         for (List<Integer> l : r) { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  13.           l.add(0, i);
  14.           ret.add(l);
  15.         }
  16.       }
  17.     }
  18.     return ret;
  19.   }
  20. . from: 1point3acres.com/bbs
  21.   public static void main(String[] args) {
  22.     Solution s = new Solution();
  23.     for (List<Integer> l : s.expression(10, 1))
  24.       System.out.println(l);
  25.   }
  26. }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
复制代码
回复 支持 反对

使用道具 举报

sheepmiemies 发表于 2016-6-22 08:57:20 | 显示全部楼层
mark一下。。。现在回头看思路要清晰一些
1. 可以直接构造一个数组[1, n],强行转化成 LC 的 Combination Sum I。多了O(n)的空间。
2. dfs的时候,给定一个上界pos,从上界pos循环到1。这个的输出结果会和LZ的例子比较像。

补充内容 (2016-6-22 08:57):
忘了标注了,是两种方法。。。
回复 支持 反对

使用道具 举报

hunter12345654 发表于 2016-7-22 09:04:27 | 显示全部楼层
这个算dp不
感觉总的思想就是 f(n)=f(0)+f(1)+f(2)+...+f(n-1);


回复 支持 反对

使用道具 举报

997562971@qq.co 发表于 2016-7-31 06:27:20 | 显示全部楼层
  1. public class FBsum {
  2.     public List<List<Integer>> fbSum(int num){
  3.         ArrayList<List<Integer>> rst= new ArrayList<>();
  4.         ArrayList<Integer> path = new ArrayList<>();. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  5.         helper(rst,path,num);
  6.         return rst;
  7.     }
  8.     private void helper(ArrayList<List<Integer>> rst, ArrayList<Integer> path, int num) {
  9.         if(num == 0){
  10.             rst.add(new ArrayList(path));
  11.             return;
  12.         }. 1point 3acres 璁哄潧
  13.         int start = 0;
  14.         if(path.size()==0){.1point3acres缃
  15.             start = 1;. 鍥磋鎴戜滑@1point 3 acres
  16.         }else{
  17.             start = path.get(path.size()-1);
  18.         }
  19.         for(int i=start;i<=num;i++){
  20.             path.add(i);
  21.             helper(rst,path,num - i);
  22.             path.remove(path.size()-1);. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  23.         }
  24.     }. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  25.     public static void main(String[] args) {
  26.         FBsum sol = new FBsum();
  27.         List<List<Integer>> rst = sol.fbSum(4);
  28.         System.out.println(rst.toString());   
  29.     }.鐣欏璁哄潧-涓浜-涓夊垎鍦
  30. }
复制代码

补充内容 (2016-7-31 06:31):. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
写了个比较容易看懂的dfs。简单试了下,应该没问题。

补充内容 (2016-7-31 06:31):. 1point3acres.com/bbs
写了个比较容易看懂的dfs..
回复 支持 反对

使用道具 举报

wzs9988 发表于 2016-7-31 07:01:39 | 显示全部楼层
  1. public static void main(String[] args) {
  2.     System.out.println(combination(10));
  3. }
  4. public static List<List<Integer>> combination(int n) {
  5.     List<List<Integer>> res = new ArrayList<>();
  6.     combination(res, new ArrayList<>(), n, 1);
  7.     return res;
  8. }
  9. private static void combination(List<List<Integer>> res, List<Integer> cur, int n, int start) {
  10.     if (n == 0) {
  11.         res.add(new ArrayList<>(cur));
    鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  12.     } else {.鏈枃鍘熷垱鑷1point3acres璁哄潧
  13.         for (int i = start; i <= n; ++i) {
  14.             cur.add(i);
  15.             combination(res, cur, n - i, i);
  16.             cur.remove(cur.size() - 1);. Waral 鍗氬鏈夋洿澶氭枃绔,
  17.         }
  18.     }
  19. }
复制代码

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

xnature 发表于 2016-8-16 07:45:51 | 显示全部楼层
short python code.鐣欏璁哄潧-涓浜-涓夊垎鍦

  1. def f(n):
  2.     ans = []
  3.     ret = [[]]
  4.     while True:
  5.         less = filter(lambda x:sum(x) < n, ret)
  6.         eq = filter(lambda x:sum(x) == n, ret)
  7.         ans.extend(eq)
  8.         if less:
  9.             ret = [r + [i] for r in less for i in range(r[-1] if r else n, 0, -1)]
  10.         else:
  11.             return ans
复制代码
. 鍥磋鎴戜滑@1point 3 acres

还可以优化但是写起来就难看了
回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-6 19:07

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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