【通知】7月22,工业界资深数据科学家教你破解各大公司面试!


一亩三分地论坛

 找回密码
 获取更多干活,快来注册

一亩三分地官方iOS手机应用下载
查看: 2965|回复: 34
收起左侧

FB面经

[复制链接] |试试Instant~ |关注本帖
frostcake 发表于 2015-2-26 22:55:25 | 显示全部楼层 |阅读模式

2015(1-3月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 |Fail

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
面经:
一个数组中将所有的非零元素移动到数组最前面,返回零的个数,比如[1,0,3,0,4,5,0,1] => [1,3,4,5,1, X,X,X] 顺序不要紧,移动之后数组后面几个元素可以是任意值

面试官要求移动次数最少,用了双指针,在求零的个数时候出了点bug,面试官也没指出来,当天就跪了

评分

3

查看全部评分

siren01 发表于 2015-3-19 20:02:45 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
  1.         public static int countMove(int[] arr){
  2.                 if(arr==null || arr.length==0)
  3.                         return 0;. visit 1point3acres.com for more.
  4.                 int left = 0;
  5.                 int right = arr.length-1;
  6.                 while(left<=right){.1point3acres缃
  7.                         while(left<=right && arr[left]!=0). from: 1point3acres.com/bbs
  8.                                 left++;
  9.                         while(left<=right && arr[right]==0).鏈枃鍘熷垱鑷1point3acres璁哄潧
  10.                                 right--;
  11.                         if(left<right){
  12.                                 int swap = arr[left];
  13.                                 arr[left] = arr[right];. more info on 1point3acres.com
  14.                                 arr[right] = swap;
  15.                         }
  16.                 }
  17.                 return arr.length-left;
  18.         }
复制代码
之前的那位说五分钟秒完bug free的大哥其实也没错,我觉得是看个人的写code习惯,有人写code如果一开始思路就对的那就不会出bug了,参考前人的思想,这代码感觉是最简的
回复 支持 1 反对 0

使用道具 举报

siren01 发表于 2015-3-19 20:04:28 | 显示全部楼层
关注一亩三分地微博:
Warald
北航小涵 发表于 2015-3-5 06:56. visit 1point3acres.com for more.
刚试了一下 这个应该是最简洁的办法了。。吧?
还有更好的建议嘛?~~~~
public class Solution {

你把while(i<j)改成while(i<=j) 就可以了,你看看我后面的代码
回复 支持 1 反对 0

使用道具 举报

lulupan 发表于 2015-2-27 12:54:36 来自手机 | 显示全部楼层
这不就是remove duplicate 的变形么。。
回复 支持 1 反对 0

使用道具 举报

sanguine 发表于 2015-2-27 01:16:37 | 显示全部楼层
移动之后数组后面几个元素可以是任意值是啥意思?

后面几个元素不都是0 了吗?
回复 支持 0 反对 1

使用道具 举报

sanguine 发表于 2015-2-27 01:38:07 | 显示全部楼层
求零的个数上果然容易出bug。。。。。。双指针交换位置后,需要prev++ post--再两个while循环,否则就多数了0  orz……

补充内容 (2015-2-26 14:43):
其实不需要一个count来计算,前后指针prev和post,当循环结束的时候,返回length - prev就是答案了orz……这样也不需要考虑各种情况了……
回复 支持 反对

使用道具 举报

tonywen2014 发表于 2015-2-27 03:06:32 | 显示全部楼层
是用leetcode 里面sort color 的1 pass solution 那样做吗?
回复 支持 反对

使用道具 举报

 楼主| frostcake 发表于 2015-2-27 12:02:02 | 显示全部楼层
tonywen2014 发表于 2015-2-27 03:06 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
是用leetcode 里面sort color 的1 pass solution 那样做吗?

那样不行,我第一次也是这样做的,面试官要求优化
回复 支持 反对

使用道具 举报

 楼主| frostcake 发表于 2015-2-27 12:03:08 | 显示全部楼层
sanguine 发表于 2015-2-27 01:38
求零的个数上果然容易出bug。。。。。。双指针交换位置后,需要prev++ post--再两个while循环,否则就多数 ...

面试官要求比这样赋值次数更少的做法
回复 支持 反对

使用道具 举报

houqingniao 发表于 2015-2-27 13:38:11 | 显示全部楼层
FB 这个也把楼主挂了 没天理啊。。。
双指针~~就完了么
回复 支持 反对

使用道具 举报

fsc111 发表于 2015-2-27 13:59:13 | 显示全部楼层
frostcake 发表于 2015-2-27 12:03
面试官要求比这样赋值次数更少的做法

请问两个数交换一次位置算是移动一次还是两次?以给出的例子为例,lz的解法交换了几次?
回复 支持 反对

使用道具 举报

lulupan 发表于 2015-2-27 17:10:27 来自手机 | 显示全部楼层
houqingniao 发表于 2015-2-27 13:38
FB 这个也把楼主挂了 没天理啊。。。
双指针~~就完了么

这种题五分钟以内bug free是起码得吧
回复 支持 反对

使用道具 举报

houqingniao 发表于 2015-2-28 05:56:21 | 显示全部楼层
lulupan 发表于 2015-2-27 17:10
这种题五分钟以内bug free是起码得吧

是不是五分钟bug-free 不敢说,但是这种题挂掉店面 有点说不过去

不过算那个多少个0 得仔细想想~~~很容易搞错
回复 支持 反对

使用道具 举报

lulupan 发表于 2015-2-28 10:25:06 | 显示全部楼层
houqingniao 发表于 2015-2-28 05:56
是不是五分钟bug-free 不敢说,但是这种题挂掉店面 有点说不过去

不过算那个多少个0 得仔细想想~~~很 ...

1,3,4,5,1, X,X,X
既然XXX了再搞一个index直接赋值就可以吧,不用交换吧,总数除去最后index不就是0的个数嘛. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
FB就是看快准狠,这种原题别人都是五分钟bug free,有什么说不过去嘛
回复 支持 反对

使用道具 举报

 楼主| frostcake 发表于 2015-2-28 12:58:25 | 显示全部楼层
fsc111 发表于 2015-2-27 13:59
请问两个数交换一次位置算是移动一次还是两次?以给出的例子为例,lz的解法交换了几次?

交换了2次,准确的说是赋值了两次
回复 支持 反对

使用道具 举报

zengm321 发表于 2015-2-28 14:40:30 | 显示全部楼层
fsc111 发表于 2015-2-27 13:59
请问两个数交换一次位置算是移动一次还是两次?以给出的例子为例,lz的解法交换了几次?

不用交换啊。以前是swap(a, a[j]), 现在a = a[j]就行了,反正后面是什么不care
i>=j的时候就结束,n-1-j就是0的个数
回复 支持 反对

使用道具 举报

北航小涵 发表于 2015-3-5 06:38:21 | 显示全部楼层
sanguine 发表于 2015-2-26 12:38
求零的个数上果然容易出bug。。。。。。双指针交换位置后,需要prev++ post--再两个while循环,否则就多数 ...

不是,比如全是 0 和全是1的情况。就不对。
回复 支持 反对

使用道具 举报

北航小涵 发表于 2015-3-5 06:45:23 | 显示全部楼层
zengm321 发表于 2015-2-28 01:40
不用交换啊。以前是swap(a, a[j]), 现在a = a[j]就行了,反正后面是什么不care. more info on 1point3acres.com
i>=j的时候就结束,n-1 ...

挺tricky哒其实,还有只有一个数1, 或者一个数0的情况。
回复 支持 反对

使用道具 举报

北航小涵 发表于 2015-3-5 06:56:40 | 显示全部楼层
zengm321 发表于 2015-2-28 01:40
不用交换啊。以前是swap(a, a[j]), 现在a = a[j]就行了,反正后面是什么不care
i>=j的时候就结束,n-1 ...

刚试了一下 这个应该是最简洁的办法了。。吧?.鏈枃鍘熷垱鑷1point3acres璁哄潧
还有更好的建议嘛?~~~~
public class Solution {.鐣欏璁哄潧-涓浜-涓夊垎鍦
    public static int countMove(int[] a) {
        if (a == null || a.length == 0) {
            return 0;
        }

        int n = a.length;. more info on 1point3acres.com
        int i = 0;
        int j = n - 1;. 鍥磋鎴戜滑@1point 3 acres
        while (i < j) {
            while (i < j && a != 0) {
                i++;
            }
            while (i < j && a[j] == 0) {
                j--;
鏉ユ簮涓浜.涓夊垎鍦拌鍧.             }
            a = a[j];
            j--;
        }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
. Waral 鍗氬鏈夋洿澶氭枃绔,
        if (a == 0) {
            return n - i;
        } else {
            return n - i - 1;. From 1point 3acres bbs
        }
    }
}
回复 支持 反对

使用道具 举报

北航小涵 发表于 2015-3-5 06:58:30 | 显示全部楼层
  1. 刚才好多代码掉了,用这个发一下吧。
复制代码
回复 支持 反对

使用道具 举报

北航小涵 发表于 2015-3-5 07:00:02 | 显示全部楼层
Screen Shot 2015-03-04 at 5.59.12 PM.png
回复 支持 反对

使用道具 举报

ilovexiao77 发表于 2015-3-5 07:49:51 | 显示全部楼层
这题是数组remove duplicate。不需要前后两个指针吧。

补充内容 (2015-3-5 07:54):
public int countZero( int[] num ) {
    int index = 0;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
    for( int i = 0; i < num.length; ++i ) {. From 1point 3acres bbs
      if( num != 0 ) {
        num[index] = num;
        index++;
      }
    }
    int ret ...
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-7-21 23:03

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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