一亩三分地论坛

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

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

问一下这个必考的2sum

[复制链接] |试试Instant~ |关注本帖
一回头的温柔 发表于 2015-3-11 10:42:39 | 显示全部楼层 |阅读模式

2015(7-9月) 码农类 硕士 实习@Amazon - 内推 - 技术电面 |Other

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

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

x
看到好多人考这个2 sum,有一种变种是输出所有的pair,这题用hashmap怎么做啊。。。。比如说{2,2,2,3,3}, target=5,所有的pair是有六对?. 1point3acres.com/bbs
另一个题顺便问了算了,这是从面经里贴下来的,用Bitset要怎么做呢,谢谢大家~
第二题:1-1000个数放到一个size为1000的array,怎么判断有没有duplication。我说了三个方法。然后开始follow up,说不用hashmap 就用array,我开始理解错了,以为让我implement 一个hashmap,我就开始写代码了,小哥说不是。让我只用Array做这个题,我才理解是让我用array代替hashmap,我说原来这样啊,那就直接对应就可以了哦,他说是的。然后又开始follow up,说如果是1-10billon 怎么办,内存不够。我卡了一分钟,再想有没有什么优化,然后小哥说你要用什么array,我突然明白他了,就说用bitset来做。他说对,然后又问用bitset需要多少空间。傻逼了,算错了应该是40/32. 楼主算成4/32, 被印度哥鄙视了,他说10个billlon int 是40个G,我连说对对对,我是傻逼。

mnmunknown 发表于 2015-3-17 08:22:07 | 显示全部楼层
今天amazon电面之前我也想了想,写了一个用linkedlist的办法参考下:

主要思路就是HashMap变成了 <Integer , Node>,而Node可以作为一个链表使用。一开始遍历所有数字并且put的时候,如果同一个值已经有了,就直接加到原先Node的next上,形成链表,就像HashTable原本处理collision一样。

而对于一个值存在 map.containsKey(target - numbers[i]) 的情况下,把 i + 1 的index 与它所map到的每一个链表里的node都遍历一遍,就可以得到所有的pairs.


import java.util.*;. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
public class TwoSum {
    private static class Node {
        int index;
        Node next;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴

        Node(int value) {.1point3acres缃
            this.index = value;
            this.next = null;
        }
    }
.鐣欏璁哄潧-涓浜-涓夊垎鍦
    public static ArrayList<ArrayList<Integer>> twoSum(int[] numbers, int target) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (numbers.length < 2) {
            return result;. more info on 1point3acres.com
        }

        // Maps value to 1-based index position
        HashMap<Integer, Node> map = new HashMap<Integer, Node>();
        for (int i = 0; i < numbers.length; i++) {
            if (!map.containsKey(numbers[i])) {
                map.put(numbers[i], new Node(i + 1));
            } else {
                map.get(numbers[i]).next = new Node(i + 1);
            }
        }

        // Find sum
        for (int i = 0; i < numbers.length; i++) {
            if (map.containsKey(target - numbers[i])) {
                int index1 = i + 1;. 鍥磋鎴戜滑@1point 3 acres
                Node node = map.get(target - numbers[i]);
                int index2;
. visit 1point3acres.com for more.
                while (node != null) {
                    index2 = node.index;
                    if (index1 >= index2) {
                        node = node.next;. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
                        continue;
                    }
                    ArrayList<Integer> list = new ArrayList<Integer>();
                    list.add(index1);. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
                    list.add(index2);
                    result.add(list);
                    node = node.next;
                }
            }
        }
        return result;
    }


    public static void main(String[] args){
        int[] input = {1 ,3, 2, 2, 3, 3, 4 ,4 , 6};. visit 1point3acres.com for more.
        ArrayList<ArrayList<Integer>> result = twoSum(input, 7);
        for(ArrayList<Integer> list : result){
            System.out.println(list.toString());.鐣欏璁哄潧-涓浜-涓夊垎鍦
        }
    }
}
回复 支持 1 反对 0

使用道具 举报

 楼主| 一回头的温柔 发表于 2015-3-11 10:44:28 | 显示全部楼层
2 SUM那道是说有重复元素的情况
回复 支持 反对

使用道具 举报

lubor 发表于 2015-3-12 02:20:31 | 显示全部楼层
1-1000个数放到一个size为1000的array,. From 1point 3acres bbs

这个是说数字的范围也是1~1000么?. visit 1point3acres.com for more.
回复 支持 反对

使用道具 举报

walteryhm 发表于 2015-3-12 04:15:17 | 显示全部楼层
就是new一个array长度的bitset 然后遍历数组 如果bitset.get(array[i])的值是false 就flip 否则return false 遍历完成return true  时间O(n) 空间O(n/32) 因为一个int是32bit

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-5 03:43

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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