一亩三分地论坛

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

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

google面筋

[复制链接] |试试Instant~ |关注本帖
wendy33 发表于 2015-2-16 07:58:52 | 显示全部楼层 |阅读模式

2015(1-3月) 码农类 硕士 全职@Google - 校园招聘会 - 技术电面 |Other

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

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

x
白人小哥,简单介绍了自己的组然后开始问问题。
第一题:给一个int array. 此array先是单调递增到某最大值,然后单调递减。 先问怎么找最小值,再问怎么求最大值,并写了求最大值的代码,二分法不用考虑最值在两端的corner case。
第二题:给一个int array,里面所有element都是unique的。让写一个shuffle函数令所有element都不在原来的位置上。比如 {1, 2, 3} -〉{2,3,1}

bless! 希望有下一轮。

评分

3

查看全部评分

joy9088 发表于 2015-2-16 12:48:32 | 显示全部楼层
先单调递增再单调递减,最小值应该就在2个端点吧,不是左端点就是右端点。而最大值的话可以用二分法,对吗?
回复 支持 反对

使用道具 举报

joy9088 发表于 2015-2-16 12:54:00 | 显示全部楼层
第二题可以采用环状形式,每一个往后错一个位置吗?如原1号数据放到2号,原2号放到3号,原3号放到4号,。。。原n-1号放到n位置,原n位置的元素放到1号,用一个循环语句,能行吗?.1point3acres缃
回复 支持 反对

使用道具 举报

skipper 发表于 2015-2-16 12:59:39 | 显示全部楼层
第二题没有其它限制么?
比较直观的方法是数组内的元素各自左移一位就行了
回复 支持 反对

使用道具 举报

houqingniao 发表于 2015-2-16 13:18:18 | 显示全部楼层
perfect shuffle 再比较是不是自己的index 这样可行吗
回复 支持 反对

使用道具 举报

Linzertorte 发表于 2015-2-16 14:09:37 | 显示全部楼层
这个标准的shuffle算法就可以。. 1point3acres.com/bbs
for(int i=v.size()-1;i>=1;i--){.1point3acres缃
    swap(v[i],v[random_between(0,i-1)]);
}
回复 支持 反对

使用道具 举报

zhenggao1986 发表于 2015-2-16 15:18:47 | 显示全部楼层
数组里面可以有连续重复的数字么?比如{2, 2, 2, 3, 3, 1, 1, 1}
如果没有连续重复则可以用二分法做,否则不行啊。比如下面的例子5.
. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
public class Test {. From 1point 3acres bbs
       
private static int findMaxHelper(int[] array, int begin, int end) {
        if (end - begin == 1) return Math.max(array[begin], array[end]);
        if (array[begin] > array[begin + 1]) return array[begin]; // descending
        if (array[begin] < array[begin + 1] && array[end - 1] < array[end]) return array[end]; // ascending
        int mid = begin + ((end - begin) >> 1);
        if (array[mid] > array[mid + 1]) return findMaxHelper(array, begin, mid);
        else return findMaxHelper(array, mid, end);
}
        . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
public static int findMax(int[] array) {. 鍥磋鎴戜滑@1point 3 acres
        return findMaxHelper(array, 0, array.length - 1);
}
. 鍥磋鎴戜滑@1point 3 acres
public static void main(String[] args) {
        int[] array1 = {1, 2, 3, 4, 5, 6, 5, 4, 3};
        int[] array2 = {3, 4, 5, 6, 5, 4, 3, 2, 1};
        int[] array3 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[] array4 = {9, 8, 7, 6, 5, 4, 3, 2, 1};
        int[] array5 = {2, 2, 2, 3, 2, 2, 2, 1, 1};
        System.out.println(findMax(array1));
        System.out.println(findMax(array2));. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
        System.out.println(findMax(array3));
        System.out.println(findMax(array4));
        System.out.println(findMax(array5));
}
}

输出
6
6
9.1point3acres缃
9
2
回复 支持 反对

使用道具 举报

zhenggao1986 发表于 2015-2-16 15:21:12 | 显示全部楼层
第二题,数组整体shift任何一数,所有的数就都不在原来位子上了呀. visit 1point3acres.com for more.
回复 支持 反对

使用道具 举报

zhenggao1986 发表于 2015-2-16 15:48:39 | 显示全部楼层
import java.util.Random;
.1point3acres缃
public class Test {

public static void swap(int[] array, int i, int j) {.鏈枃鍘熷垱鑷1point3acres璁哄潧
        if (i == j) return;. from: 1point3acres.com/bbs
        array[i] ^= array[j];
        array[j] ^= array[i];. from: 1point3acres.com/bbs
        array[i] ^= array[j];
}

public static void shuffle(int[] array) {
        Random r = new Random(); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
        for (int i = 0; i < array.length - 1; ++i)
                swap(array, i, r.nextInt(array.length - i - 1) + i + 1);.1point3acres缃
}

public static void print(int[] array) {
        for (int i : array).鐣欏璁哄潧-涓浜-涓夊垎鍦
                System.out.print(i + " ");
        System.out.println();
}

public static boolean test() {
        for (int i = 0; i < 10000; ++i) {. 1point 3acres 璁哄潧
                int[] arrayTest = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                shuffle(arrayTest);
                for (int j = 0; j < arrayTest.length; ++j)
                        if (arrayTest[j] == j) return false;
        }
        return true;
}

public static void main(String[] args) {
        int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        print(array);
        shuffle(array);
        print(array);
. From 1point 3acres bbs        System.out.println(test());
}-google 1point3acres
}

运行结果
0 1 2 3 4 5 6 7 8 9
9 7 5 8 0 3 1 2 4 6
true
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:06:30 | 显示全部楼层
joy9088 发表于 2015-2-16 12:48
先单调递增再单调递减,最小值应该就在2个端点吧,不是左端点就是右端点。而最大值的话可以用二分法,对吗 ...

恩恩,是的
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:08:30 | 显示全部楼层
Linzertorte 发表于 2015-2-16 14:09
这个标准的shuffle算法就可以。
for(int i=v.size()-1;i>=1;i--){. Waral 鍗氬鏈夋洿澶氭枃绔,
    swap(v,v[random_between(0,i-1)]) ...

嗯嗯,我也是这么想的
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:09:25 | 显示全部楼层
joy9088 发表于 2015-2-16 12:54
第二题可以采用环状形式,每一个往后错一个位置吗?如原1号数据放到2号,原2号放到3号,原3号放到4号,。。 ...

当时面试官说要尽量randomize哈,忘了强调这一点
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:09:46 | 显示全部楼层
skipper 发表于 2015-2-16 12:59
第二题没有其它限制么?
比较直观的方法是数组内的元素各自左移一位就行了

当时面试官说要尽量randomize哈,忘了强调这一点
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:09:56 | 显示全部楼层
houqingniao 发表于 2015-2-16 13:18
perfect shuffle 再比较是不是自己的index 这样可行吗

当时面试官说要尽量randomize哈,忘了强调这一点
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:12:00 | 显示全部楼层
zhenggao1986 发表于 2015-2-16 15:18
数组里面可以有连续重复的数字么?比如{2, 2, 2, 3, 3, 1, 1, 1}
如果没有连续重复则可以用二分法做,否则 ...

第一题的话是可以有重复,但是重复的值不能连在一起,所以是严格单调增加接着严格单调递减. 向面试官clarify,他说就只考虑这种情况.
第二题 当时面试官说要尽量randomize哈,忘了强调这一点
回复 支持 反对

使用道具 举报

 楼主| wendy33 发表于 2015-2-16 23:13:53 | 显示全部楼层
抱歉抱歉, 帖子发的太不严谨啦。希望有改进的机会.呵呵....
回复 支持 反对

使用道具 举报

joy9088 发表于 2015-2-17 05:00:04 | 显示全部楼层
谢谢分享哈
回复 支持 反对

使用道具 举报

碇真嗣 发表于 2015-2-17 05:28:40 | 显示全部楼层
多谢LZ分享!
回复 支持 反对

使用道具 举报

mengxiangjia 发表于 2015-2-17 07:11:49 | 显示全部楼层
zhenggao1986 发表于 2015-2-16 15:18
数组里面可以有连续重复的数字么?比如{2, 2, 2, 3, 3, 1, 1, 1}
如果没有连续重复则可以用二分法做,否则 ...
.鐣欏璁哄潧-涓浜-涓夊垎鍦
因为是单调递增递减,应该就没有重复了吧
回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-3 04:26

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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