由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请教一道面试题
相关主题
求解一道数组找最大cycle长度的问题你们刷题都刷傻了, 那么简单的题目都做错
G家这道题怎么做的?Google店面
一个N个数的int数组如何找到3个majority的数?问个题
amazon问题求教longest increasing subsequence O(NlogN)算法中数组 P 是否必
弱弱的问问 2sum, 3sum 的问题一道google 经典题
问一道google的面试题荷兰国旗问题的扩展
请教中文OJ一道题调试成功的next_permutation代码
fb面经的一题leetcode wordsearch的时间复杂度?
相关话题的讨论汇总
话题: maxl话题: nochange话题: int话题: changed话题: max
进入JobHunting版参与讨论
1 (共1页)
s******i
发帖数: 236
1
一个0和1组成的数组,改变其中一个数(0变1或者1变0),使得改变后数组里连续的0
或者1的长度最大,返回这个最大长度。要求O(N)。
比如[1 0 1],改变0,返回3
[1 1 0 1 0 0],改变中间的0或者1,返回4
m*****n
发帖数: 2152
2
很简单啊,
第一遍算每个区间的连续0或者1的长度,
比如[1 0 1],就是[1 1 1]
[1 1 0 1 0 0] 就是[2 1 1 2]
然后,第二遍扫看看[x 1 y]这个pattern的最大的和x+1+y是多少。
对不符合这种pattern的情况,就是最大的串的长度+1 或者是 最大的串的长度(这儿
有个问
题,如果全0或者全1,必须改吗?)。
其实实际编程,只要一遍就行了,用个 3 elements的moving window,有点DP的意思。

0

【在 s******i 的大作中提到】
: 一个0和1组成的数组,改变其中一个数(0变1或者1变0),使得改变后数组里连续的0
: 或者1的长度最大,返回这个最大长度。要求O(N)。
: 比如[1 0 1],改变0,返回3
: [1 1 0 1 0 0],改变中间的0或者1,返回4

f******t
发帖数: 18
3
//f1,f2分别表示0次改变跟1次改变时,当前的最长连续1的长度
int longestOne(const vector& arr) {
int f1 = 0, f2 = 0, ret = 0;
for (int i = 0; i < arr.size(); ++i) {
if (arr[i]) {
++f1; ++f2;
} else {
f2 = f1 + 1;
f1 = 0;
}
ret = max(ret, f2);
}
return ret;
}
m*****n
发帖数: 2152
4
如果数组全0,你是result是 1?

【在 f******t 的大作中提到】
: //f1,f2分别表示0次改变跟1次改变时,当前的最长连续1的长度
: int longestOne(const vector& arr) {
: int f1 = 0, f2 = 0, ret = 0;
: for (int i = 0; i < arr.size(); ++i) {
: if (arr[i]) {
: ++f1; ++f2;
: } else {
: f2 = f1 + 1;
: f1 = 0;
: }

l*********8
发帖数: 4642
5
int maxConsecutive(const vector & ary) {
int changed[2] = {0, 0};
int noChange[2] = {0, 0};
int maxL = 0;
for (bool x : ary) {
maxL = max(maxL, ++changed[x]);
maxL = max(maxL, ++noChange[x]);
changed[1-x] = noChange[1-x];
noChange[1-x] = 0;
}
return maxL;
}

0

【在 s******i 的大作中提到】
: 一个0和1组成的数组,改变其中一个数(0变1或者1变0),使得改变后数组里连续的0
: 或者1的长度最大,返回这个最大长度。要求O(N)。
: 比如[1 0 1],改变0,返回3
: [1 1 0 1 0 0],改变中间的0或者1,返回4

m*****n
发帖数: 2152
6
不对吧,[0 1]的result是1?

【在 l*********8 的大作中提到】
: int maxConsecutive(const vector & ary) {
: int changed[2] = {0, 0};
: int noChange[2] = {0, 0};
: int maxL = 0;
: for (bool x : ary) {
: maxL = max(maxL, ++changed[x]);
: maxL = max(maxL, ++noChange[x]);
: changed[1-x] = noChange[1-x];
: noChange[1-x] = 0;
: }

l*********8
发帖数: 4642
7
写错了, 谢谢指出。
loop 里面第三行少了个 加1
int maxConsecutive(const vector & ary) {
int changed[2] = {0, 0};
int noChange[2] = {0, 0};
int maxL = 0;
for (bool x : ary) {
maxL = max(maxL, ++changed[x]);
maxL = max(maxL, ++noChange[x]);
changed[1-x] = 1 + noChange[1-x];
noChange[1-x] = 0;
}
return maxL;
}

【在 m*****n 的大作中提到】
: 不对吧,[0 1]的result是1?
f******n
发帖数: 279
8
mark
s******i
发帖数: 236
9

如果全是0也要改,所以应该是最长长度-1

【在 m*****n 的大作中提到】
: 很简单啊,
: 第一遍算每个区间的连续0或者1的长度,
: 比如[1 0 1],就是[1 1 1]
: [1 1 0 1 0 0] 就是[2 1 1 2]
: 然后,第二遍扫看看[x 1 y]这个pattern的最大的和x+1+y是多少。
: 对不符合这种pattern的情况,就是最大的串的长度+1 或者是 最大的串的长度(这儿
: 有个问
: 题,如果全0或者全1,必须改吗?)。
: 其实实际编程,只要一遍就行了,用个 3 elements的moving window,有点DP的意思。
:

f******t
发帖数: 18
10

原來是0或1?我之前看以為是連續1~我的代碼是連續1最長長度

【在 m*****n 的大作中提到】
: 如果数组全0,你是result是 1?
相关主题
问一道google的面试题你们刷题都刷傻了, 那么简单的题目都做错
请教中文OJ一道题Google店面
fb面经的一题问个题
进入JobHunting版参与讨论
M**a
发帖数: 848
11
mark下。
m******3
发帖数: 346
12
能解释一下思路么,没太明白

【在 l*********8 的大作中提到】
: 写错了, 谢谢指出。
: loop 里面第三行少了个 加1
: int maxConsecutive(const vector & ary) {
: int changed[2] = {0, 0};
: int noChange[2] = {0, 0};
: int maxL = 0;
: for (bool x : ary) {
: maxL = max(maxL, ++changed[x]);
: maxL = max(maxL, ++noChange[x]);
: changed[1-x] = 1 + noChange[1-x];

a**********0
发帖数: 422
13
我来解释一下?
int changed[2] = {0, 0};
记录 0或者1组成的连续串最长是多少 此串变化过一次
int noChange[2] = {0, 0};
记录 0或者1组成的连续串最长是多少 此串没有变化过
change【1】 可以理解为 1的通过俘虏0的连续串得到的 so far的连续串长度
扫描每一个数 有几种操作
此数必定破坏原来对手的unchange过的串 也就是使之归零
此数可以变化为对手 这样 对手的change = 对手unchange +1
无论如何情况 都破坏了对手的unchange的串 必须归零 因为即使第二种情况 对手的
unchange的串也不再是unchange了
当然此数也做 这么两件事
使自己change的串长度加一
使自己未经change的串长度加一
如果可以把这部分逻辑从max函数中拿出来会清晰很多吧
两个max是如果不去change应该如何
后边的两个语句是如果x变成对手应该如何
longway太牛了 其实这是dp
maxL = max(maxL, ++changed[x]);
maxL = max(maxL, ++noChange[x]);
下标如果换成 if x == else 可能更清楚

【在 m******3 的大作中提到】
: 能解释一下思路么,没太明白
l*********8
发帖数: 4642
14
谢谢apprentice00,  解释得很清楚。

【在 a**********0 的大作中提到】
: 我来解释一下?
: int changed[2] = {0, 0};
: 记录 0或者1组成的连续串最长是多少 此串变化过一次
: int noChange[2] = {0, 0};
: 记录 0或者1组成的连续串最长是多少 此串没有变化过
: change【1】 可以理解为 1的通过俘虏0的连续串得到的 so far的连续串长度
: 扫描每一个数 有几种操作
: 此数必定破坏原来对手的unchange过的串 也就是使之归零
: 此数可以变化为对手 这样 对手的change = 对手unchange +1
: 无论如何情况 都破坏了对手的unchange的串 必须归零 因为即使第二种情况 对手的

y***n
发帖数: 1594
15
这个万一考的人看不懂怎么办?
a***n
发帖数: 623
16
你这个还是不对吧。
比如 [1,1,0,1,0,0,0,0,0,0,0,0,0,0]的结果是4?不过思路挺好的,再加一个变量就
可以0空间开销了。

【在 f******t 的大作中提到】
: //f1,f2分别表示0次改变跟1次改变时,当前的最长连续1的长度
: int longestOne(const vector& arr) {
: int f1 = 0, f2 = 0, ret = 0;
: for (int i = 0; i < arr.size(); ++i) {
: if (arr[i]) {
: ++f1; ++f2;
: } else {
: f2 = f1 + 1;
: f1 = 0;
: }

a***n
发帖数: 623
17
赞解释,我是把changed数组作为大小为1的cache……
这代码面试的时候写出来估计面试官都要跪了。

【在 a**********0 的大作中提到】
: 我来解释一下?
: int changed[2] = {0, 0};
: 记录 0或者1组成的连续串最长是多少 此串变化过一次
: int noChange[2] = {0, 0};
: 记录 0或者1组成的连续串最长是多少 此串没有变化过
: change【1】 可以理解为 1的通过俘虏0的连续串得到的 so far的连续串长度
: 扫描每一个数 有几种操作
: 此数必定破坏原来对手的unchange过的串 也就是使之归零
: 此数可以变化为对手 这样 对手的change = 对手unchange +1
: 无论如何情况 都破坏了对手的unchange的串 必须归零 因为即使第二种情况 对手的

a***n
发帖数: 623
18
是不是还是有点小bug
比如[1,1,0]的时候最后一个0就没有计算,返回是2?

【在 l*********8 的大作中提到】
: int maxConsecutive(const vector & ary) {
: int changed[2] = {0, 0};
: int noChange[2] = {0, 0};
: int maxL = 0;
: for (bool x : ary) {
: maxL = max(maxL, ++changed[x]);
: maxL = max(maxL, ++noChange[x]);
: changed[1-x] = noChange[1-x];
: noChange[1-x] = 0;
: }

l*********8
发帖数: 4642
19
赞!
还是出bug啊,
改正了:
int maxConsecutive(const vector & ary) {
int changed[2] = {0, 0};
int noChange[2] = {0, 0};
int maxL = 0;
for (bool x : ary) {
++changed[x];
++noChange[x];
changed[1-x] = 1 + noChange[1-x];
noChange[1-x] = 0;
maxL = max(maxL, changed[x]);
maxL = max(maxL, changed[1-x]);
}
return maxL;
}

【在 a***n 的大作中提到】
: 是不是还是有点小bug
: 比如[1,1,0]的时候最后一个0就没有计算,返回是2?

y***n
发帖数: 1594
20
又看了一遍,太牛了。这就是差距。想想自己工资低一点,也认了。。
相关主题
longest increasing subsequence O(NlogN)算法中数组 P 是否必调试成功的next_permutation代码
一道google 经典题leetcode wordsearch的时间复杂度?
荷兰国旗问题的扩展LeetCode上word search问题的几个例子不对
进入JobHunting版参与讨论
k**8
发帖数: 186
21
我也认了
c*******r
发帖数: 610
22
mark
b*********t
发帖数: 170
23
还有点问题吧,如果0000就输出4了,按题意应该是3?

【在 l*********8 的大作中提到】
: 赞!
: 还是出bug啊,
: 改正了:
: int maxConsecutive(const vector & ary) {
: int changed[2] = {0, 0};
: int noChange[2] = {0, 0};
: int maxL = 0;
: for (bool x : ary) {
: ++changed[x];
: ++noChange[x];

l*********8
发帖数: 4642
24
是的,谢谢指出。
我开始是按照“改不改一个数字都行”来做的,后来楼主clarify 要求后,我没改干净
。。。。
看似简单的题目,一定要小心再小心。

【在 b*********t 的大作中提到】
: 还有点问题吧,如果0000就输出4了,按题意应该是3?
m*****k
发帖数: 731
25
你不是说了:一个0和1组成的数组

【在 s******i 的大作中提到】
:
: 如果全是0也要改,所以应该是最长长度-1

h****j
发帖数: 15
26
Here are my 5 cents.
It will be easier to understand if we denote the position explicitly in the
iteration.
Let g_k[x] be the longest continuous `x` ending at position k, (exactly, not
at most) one change has been made.
Let f_k[x] represent the longest continous `x` ending at position k, no
change has been made.
Then we have the following iterative equations.
Update changed
g_{k+1} [x] = g_k [x] + 1
g_{k+1} [1-x] = f_k [1-x] + 1
Update unchanged
f_{k+1} [x] = f_k[x] + 1
f_{k+1} [1-x] = 0
----------------------------------------------
The corresponding code is:
int maxConsecNumChangeOne(vector &A) {
vector f(2, 0), g(2, -1);
int maxL = 0;
for (int x : A) {
g[x]++;
g[1-x] = f[1-x] + 1;
f[x]++;
f[1-x] = 0;
maxL = max(maxL, g[x]);
}
return maxL;
}
Welcome to point it out if you find any bug in the code.
b********r
发帖数: 620
27

the
not

【在 h****j 的大作中提到】
: Here are my 5 cents.
: It will be easier to understand if we denote the position explicitly in the
: iteration.
: Let g_k[x] be the longest continuous `x` ending at position k, (exactly, not
: at most) one change has been made.
: Let f_k[x] represent the longest continous `x` ending at position k, no
: change has been made.
: Then we have the following iterative equations.
: Update changed
: g_{k+1} [x] = g_k [x] + 1

1 (共1页)
进入JobHunting版参与讨论
相关主题
leetcode wordsearch的时间复杂度?弱弱的问问 2sum, 3sum 的问题
LeetCode上word search问题的几个例子不对问一道google的面试题
leetcode 3sum c++解法超时请教中文OJ一道题
leetcode 的 Insert Interval 就是过不了大的fb面经的一题
求解一道数组找最大cycle长度的问题你们刷题都刷傻了, 那么简单的题目都做错
G家这道题怎么做的?Google店面
一个N个数的int数组如何找到3个majority的数?问个题
amazon问题求教longest increasing subsequence O(NlogN)算法中数组 P 是否必
相关话题的讨论汇总
话题: maxl话题: nochange话题: int话题: changed话题: max