一亩三分地论坛

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

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

FB面经

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

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

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

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

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 | 显示全部楼层
  1.         public static int countMove(int[] arr){
  2.                 if(arr==null || arr.length==0)
  3.                         return 0;. 鍥磋鎴戜滑@1point 3 acres
  4.                 int left = 0;.鐣欏璁哄潧-涓浜-涓夊垎鍦
  5.                 int right = arr.length-1;
  6.                 while(left<=right){
  7.                         while(left<=right && arr[left]!=0). 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  8.                                 left++;
  9.                         while(left<=right && arr[right]==0)
  10.                                 right--;
  11.                         if(left<right){
  12.                                 int swap = arr[left];
  13.                                 arr[left] = arr[right];
  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 | 显示全部楼层
北航小涵 发表于 2015-3-5 06:56. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
刚试了一下 这个应该是最简洁的办法了。。吧?
还有更好的建议嘛?~~~~. from: 1point3acres.com/bbs
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 不敢说,但是这种题挂掉店面 有点说不过去
. 鍥磋鎴戜滑@1point 3 acres
不过算那个多少个0 得仔细想想~~~很容易搞错
回复 支持 反对

使用道具 举报

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

不过算那个多少个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
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 ...

刚试了一下 这个应该是最简洁的办法了。。吧?
还有更好的建议嘛?~~~~. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
public class Solution {
    public static int countMove(int[] a) {
        if (a == null || a.length == 0) {
            return 0;
        }

        int n = a.length;
        int i = 0;
        int j = n - 1;. From 1point 3acres bbs
        while (i < j) {
            while (i < j && a != 0) {
                i++;. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
            }
            while (i < j && a[j] == 0) {
                j--;
            }
            a = a[j];
            j--;
        }

        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 ) {
      if( num != 0 ) {
        num[index] = num;
        index++;
      }. from: 1point3acres.com/bbs
    }
    int ret ...
回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-8 11:57

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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