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

FB热乎跪经

 
🔗
codemonk 2017-10-8 04:42:25 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
yuhoandjohn 2017-10-8 05:41:12 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
codemonk 2017-10-8 08:38:58 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
yitati 2017-10-9 01:44:51 | 只看该作者
全局:
楼主这个是第一轮么?
回复

使用道具 举报

🔗
jinxihexi0411 2017-10-9 05:13:04 | 只看该作者
全局:
  1. import java.util.*;

  2. public class Test {
  3.     class Num {
  4.         int val;
  5.         int index;
  6.         int flag;
  7.         Num(int d, int i, int f) {
  8.             this.val = d;
  9.             this.index = i;
  10.             this.flag = f;
  11.         }
  12.     }

  13.     public void print(int[] nums) {
  14.         if (nums == null || nums.length < 4) {
  15.             return;
  16.         }

  17.         int n = nums.length;
  18.         List<Num> lists = new ArrayList<>(2 * n);

  19.         for (int i = 0; i < n; i++) {
  20.             lists.add(new Num(nums[i], i, 1));
  21.             if (nums[i] != 0)
  22.                 lists.add(new Num(-1 * nums[i], i, -1));
  23.         }

  24.         Collections.sort(lists, new Comparator<Num>(){
  25.             public int compare(Num n1, Num n2) {
  26.                 if (n1.val == n2.val) {
  27.                     return n1.index - n2.index;
  28.                 }

  29.                 return n1.val - n2.val;
  30.             }
  31.         });


  32.         int len = lists.size();
  33.         for (int i = 0; i < len - 3; i++) {
  34.             if (lists.get(i).val + lists.get(i + 1).val + lists.get(i + 2).val + lists.get(i + 3).val > 0)
  35.                 break;
  36.             if (lists.get(i).val + lists.get(len - 1).val + lists.get(len - 2).val + lists.get(len - 3).val < 0)
  37.                 continue;

  38.             for (int j = i + 1; j < len - 2; j++) {
  39.                 if (lists.get(i).val + lists.get(j).val + lists.get(j + 1).val + lists.get(j + 2).val > 0)
  40.                     break;
  41.                 if (lists.get(i).val + lists.get(j).val + lists.get(len - 1).val + lists.get(len - 2).val < 0)
  42.                     continue;
  43.                 int left = j + 1, right = len - 1;
  44.                 while (left < right) {
  45.                     if (lists.get(i).val + lists.get(j).val + lists.get(left).val + lists.get(right).val == 0) {
  46.                         printRes(i, j, left++, right--, lists);
  47.                     } else if (lists.get(i).val + lists.get(j).val + lists.get(left).val + lists.get(right).val < 0) {
  48.                         left++;
  49.                     } else {
  50.                         right--;
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.     }

  56.     private void printRes(int i1, int i2, int i3, int i4, List<Num> lists) {
  57.         List<Num> res = new ArrayList<>(4);
  58.         res.add(lists.get(i1));
  59.         res.add(lists.get(i2));
  60.         res.add(lists.get(i3));
  61.         res.add(lists.get(i4));
  62.         
  63.         Set<Integer> visited = new HashSet<>();
  64.         int flagSum = 0;
  65.         for (Num n : res) {
  66.             flagSum += n.flag;
  67.             visited.add(n.index);
  68.         }

  69.         if (flagSum != 0 || visited.size() != 4)
  70.             return;

  71.         Collections.sort(res, new Comparator<Num>(){
  72.             public int compare(Num n1, Num n2) {
  73.                 if (n1.flag == n2.flag)
  74.                     return n1.index - n2.index;

  75.                 return n1.flag - n2.flag;
  76.             }
  77.         });

  78.         if (res.get(0).index > res.get(2).index)
  79.             return;

  80.         System.out.println("Print index");
  81.         System.out.println(res.get(0).index+"+"+res.get(1).index+"="+res.get(2).index+"+"+res.get(3).index);
  82.         System.out.println("Print val");
  83.         System.out.println(-res.get(0).val+"+"+-res.get(1).val+"="+res.get(2).val+"+"+res.get(3).val);
  84.         
  85.         // System.out.println(lists.get(i2).index+"+"+lists.get(i1).index+"="+lists.get(i3).index+"+"+lists.get(i4).index);
  86.         // System.out.println(lists.get(i1).index+"+"+lists.get(i2).index+"="+lists.get(i4).index+"+"+lists.get(i3).index);
  87.         // System.out.println(lists.get(i2).index+"+"+lists.get(i1).index+"="+lists.get(i4).index+"+"+lists.get(i3).index);
  88.         System.out.println("");
  89.     }

  90.     public static void main(String args[]){
  91.         Test test = new Test();
  92.         int[] nums = new int[]{1,2,3,4,5,6};
  93.         test.print(nums);
  94.     }
  95. }
复制代码


java版,欢迎指正。
我觉得代码应该只适用于数字都不重复的情况

评分

参与人数 1大米 +3 收起 理由
jigsaw_Becky + 3 感谢分享!

查看全部评分

回复

使用道具 举报

🔗
 楼主| wjq987564321 2017-10-9 09:37:47 | 只看该作者
全局:
yitati 发表于 2017-10-9 01:44
楼主这个是第一轮么?

是第一轮 字数
回复

使用道具 举报

🔗
wstjpu 2017-10-12 06:02:12 | 只看该作者
全局:
我觉得O(n^3)次是可行的,即使不排序,分别去第一个数的index i和第二个数的index j, index j之后用 hashmap那种做法解一个two sum,得到的一组4个数字,就可以排列出结果实现了ABCD BACD ABDC BADC

或者在数组里枚举分割线,左边枚举pair 右边枚举pair 遇到sum 相等,就输出排列。

没想到n^2该怎么写。哪位大神不吝赐教。
回复

使用道具 举报

🔗
y011235 2017-10-12 13:11:00 | 只看该作者
全局:
@wstjpu 的方法, O(n^3)

  1.    
  2. public List<int[]> find(int[] nums) {
  3.         int n = nums.length;
  4.         List<int[]> res = new ArrayList<>();
  5.         Map<Integer, int[]> resmap = new HashMap<>();
  6.         for (int i = 0; i < n; i ++) {
  7.             for (int j = i + 1; j < n; j++) {
  8.                 int sum = nums[i] + nums[j];
  9.                 Map<Integer, List<Integer>> map = new HashMap<>();
  10.                 for (int k = i + 1; k < n; k++) {
  11.                     if (k == i || k == j) {
  12.                         continue;
  13.                     }
  14.                     List<Integer> idxes = map.get(sum - nums[k]);
  15.                     if (idxes != null) {
  16.                         for (int idx :idxes) {
  17.                             addPairs(resmap, new int[]{i, j, k, idx});
  18.                         }
  19.                     }
  20.                     List<Integer> currIdxes = map.get(nums[k]);
  21.                     if (currIdxes == null) {
  22.                         currIdxes = new ArrayList<>();
  23.                         map.put(nums[k], currIdxes);
  24.                     }
  25.                     currIdxes.add(k);
  26.                 }
  27.             }
  28.         }
  29.         return new ArrayList<>(resmap.values());
  30.     }

  31.     private void addPairs(Map<Integer, int[]> resmap, int[] pair) {
  32.         int[] p1 = new int[]{pair[1], pair[0], pair[2], pair[3]};
  33.         int[] p2 = new int[]{pair[1], pair[0], pair[3], pair[2]};
  34.         int[] p3 = new int[]{pair[0], pair[1], pair[3], pair[2]};

  35.         resmap.put(Arrays.hashCode(pair), pair);
  36.         resmap.put(Arrays.hashCode(p1), p1);
  37.         resmap.put(Arrays.hashCode(p2), p2);
  38.         resmap.put(Arrays.hashCode(p3), p3);
  39.     }
复制代码
回复

使用道具 举报

🔗
jenniewang 2017-10-12 14:46:05 | 只看该作者
全局:
感觉用标准4sum的方法可以做到N^3,N^2实在想不到了
回复

使用道具 举报

🔗
jenniewang 2017-10-12 14:47:05 | 只看该作者
全局:
wstjpu 发表于 2017-10-12 06:02
我觉得O(n^3)次是可行的,即使不排序,分别去第一个数的index i和第二个数的index j, index j之后用 hashm ...

感觉还是排序好一些
回复

使用道具 举报

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

本版积分规则

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