由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一道code assessment
进入JobHunting版参与讨论
1 (共1页)
a********r
发帖数: 218
1
要我优化下面的程序, 怎么优化呀?
int maxDiff(vector& A)
{
int N = A.size();
int result = 0;
for (int i = 0; i < N; i++)
for (int j = i; j < N; j++)
if (A[i] != A[j])
result = max(result, j - i);
return result;
}
k****r
发帖数: 421
2
可以优化到线性吧。。。。。。
s***5
发帖数: 2136
3
这么土鳖的问题,太丢人了
两个指针从两头扫一遍搞定。
c**s
发帖数: 159
4
问题转化
对每个 i , minj 使得 A[i] != A[j]
当然还要求maxj
求minj的话 其实就是对不等于A[0]的A[I],
j取0
如果A[i]==A[0] j取最小的不等于A[0]的下标
类似可求maxj.
或者把数组翻转再求一次 minj
如此扫描两次即可

【在 a********r 的大作中提到】
: 要我优化下面的程序, 怎么优化呀?
: int maxDiff(vector& A)
: {
: int N = A.size();
: int result = 0;
: for (int i = 0; i < N; i++)
: for (int j = i; j < N; j++)
: if (A[i] != A[j])
: result = max(result, j - i);
: return result;

f*******t
发帖数: 7549
5
这不就是扫一遍找出max和min,相减得result
O(n^2)优化到O(n)
s***5
发帖数: 2136
6
多少人连题都没看懂?面试的话上面基本都要被刷掉了。找的是不相等的元素在数组中
的最远距离(index之差),没什么min,max。就从两端往中间扫,直到找到一对不相等
的。
Y********g
发帖数: 1
7
Re

【在 s***5 的大作中提到】
: 多少人连题都没看懂?面试的话上面基本都要被刷掉了。找的是不相等的元素在数组中
: 的最远距离(index之差),没什么min,max。就从两端往中间扫,直到找到一对不相等
: 的。

W***u
发帖数: 1
8
题目看懂了,解法错误
index之差最大是n-1, 最小是1
在一个for loop里,x 范围从n-1到1,遍历所有距离为x 的index pair,找到就返回

【在 s***5 的大作中提到】
: 多少人连题都没看懂?面试的话上面基本都要被刷掉了。找的是不相等的元素在数组中
: 的最远距离(index之差),没什么min,max。就从两端往中间扫,直到找到一对不相等
: 的。

W***u
发帖数: 1
9
sliding window 变种
A***g
发帖数: 1816
10
可以非常简单的做法
1. 看两头,如果不等,return n-1
2. 如果两头相等,loop一遍,每次看到第一个和不等的 i,返回max(i, n-i)
b******g
发帖数: 77
11
Something like:
int maxDiff(vector& A)
{
int N = A.size();
if (N < 2) return 0;
for (int i = 0, j = N-1; i < j;) {
if (A[i] != A[j]) return j - i;
if (A[i] == A[i + 1]) { ++i }
else { --j }
}
return 0;
}
a********r
发帖数: 218
12
验证过了,100分。
膜拜大牛!

【在 b******g 的大作中提到】
: Something like:
: int maxDiff(vector& A)
: {
: int N = A.size();
: if (N < 2) return 0;
: for (int i = 0, j = N-1; i < j;) {
: if (A[i] != A[j]) return j - i;
: if (A[i] == A[i + 1]) { ++i }
: else { --j }
: }

b****h
发帖数: 2105
13
他是错的

【在 a********r 的大作中提到】
: 验证过了,100分。
: 膜拜大牛!

X****N
发帖数: 376
14
int maxDiff(vector& A)
{
if (A.size() <= 1) {
return 0;
}
int head = 0;
int tail = A.size() - 1;
if (A[head] != A[tail]) {
return tail - head;
}

int first_diff = head; // first diff from head
while (first_diff < tail && A[first_diff] == A[head]) { first_diff++ };
if (first_diff >= tail) {
// no diff element
return 0;
}
int last_diff = tail; // first diff from tail
while (last_diff > 0 && A[last_diff] == A[tail]) { last_diff-- };

return max(
last_diff-head, // from head to last diff
tail-first_diff // from first diff to tail
);
}
f*******t
发帖数: 7549
15
我觉得if (A[i] == A[i + 1]) { ++i }是错的

【在 b****h 的大作中提到】
: 他是错的
a********r
发帖数: 218
16
我用这个
vector A = {4, 5, 2, 2, 6, 6, 4};
验证了一下,是对的。 你能给个例子说明他是错的吗?

【在 f*******t 的大作中提到】
: 我觉得if (A[i] == A[i + 1]) { ++i }是错的
i******u
发帖数: 1
17
这个还是要扫很多重复的。
难道不是第一个从头扫,第二个也是从头扫,然后扫到不等后,直接修改第一个的
index。就是加一句 i=j;

【在 W***u 的大作中提到】
: 题目看懂了,解法错误
: index之差最大是n-1, 最小是1
: 在一个for loop里,x 范围从n-1到1,遍历所有距离为x 的index pair,找到就返回

W***u
发帖数: 1
18
Try 4,5,4,4,4,4,4

【在 a********r 的大作中提到】
: 我用这个
: vector A = {4, 5, 2, 2, 6, 6, 4};
: 验证了一下,是对的。 你能给个例子说明他是错的吗?

W***u
发帖数: 1
19
i 和j不能同时动,必需要两个loop

【在 i******u 的大作中提到】
: 这个还是要扫很多重复的。
: 难道不是第一个从头扫,第二个也是从头扫,然后扫到不等后,直接修改第一个的
: index。就是加一句 i=j;

f*******t
发帖数: 7549
20
{1,1,1,2,1} return 1
正确结果应该是3
我觉得这题的解可能还是要O(n^2)复杂度,代码可以优化一些

【在 a********r 的大作中提到】
: 我用这个
: vector A = {4, 5, 2, 2, 6, 6, 4};
: 验证了一下,是对的。 你能给个例子说明他是错的吗?

N**********n
发帖数: 1
21
two pointers O(N)
int maxDiff(vector& A)
{
int N = A.size();
int result = 0;
if(A[0] != A[N-1])
return N-1;
int i = 0, j = N-1;
while(i <= j && A[i] == A[0])
i++;
while(i <= j && A[j] == A[0])
j--;
if(i > j)
return 0;
return max(N-1-i, j);
}
n******g
发帖数: 2201
22
O(n) two-pass:
https://www.geeksforgeeks.org/maximum-distance-between-two-unequal-elements/

【在 f*******t 的大作中提到】
: {1,1,1,2,1} return 1
: 正确结果应该是3
: 我觉得这题的解可能还是要O(n^2)复杂度,代码可以优化一些

w*****e
发帖数: 721
23
int maxDiff(vector& A)
{
int N = A.size();
int result = 0;
if(A[0] != A[N-1])
return N-1;
int i = 0, j = N-1;
while(i <= j && A[i] == A[j]){
if (A[i] != A[i+1] || A[j] != A[j-1])
return (j-1-i);
}
i++; j--;
}
if(i > j)
return 0;
return max(N-1-i, j);
}
n******g
发帖数: 2201
24
def maxDistance(A):
if A[0] != A[-1]:
return len(A) - 1

res = 0
for i, a in enumerate(A):
if a != A[0]:
res = max(i, len(A) - i - 1)
return res
based on AMang's idea

【在 A***g 的大作中提到】
: 可以非常简单的做法
: 1. 看两头,如果不等,return n-1
: 2. 如果两头相等,loop一遍,每次看到第一个和不等的 i,返回max(i, n-i)

b*f
发帖数: 212
25
这样应该没错吧:
5 int maxDiff(vector& A){
6
7 int N=A.size();
8 if(N<2) return 0;
9 for(int i=0, j=N-1; i 10 if(A[i]!=A[j])
11 return j-i;
12 else if(A[i]==A[i+1])
13 j--;
14 else
15 return j-i-1;
16 }
17
18
19 return 0;
20 }
s***5
发帖数: 2136
26
叔在最上面就指出两个指针往中间扫,居然有人说是错的,有人说还是要n^2,无语了。
int maxIndexDiff(vector nums) {
int n = nums.size();
if(n == 0) return 0;
if(nums[0] != nums[n - 1])
return n - 1;
int i = 0;
while(i < n - 1 && nums[i] == nums[i + 1]) i++;
if(i == n - 1) return 0;
return max(i + 1, n - 2 - i);
}
f*******t
发帖数: 7549
27
唉,刷题不能停,一个月不刷大脑就生锈啦

了。

【在 s***5 的大作中提到】
: 叔在最上面就指出两个指针往中间扫,居然有人说是错的,有人说还是要n^2,无语了。
: int maxIndexDiff(vector nums) {
: int n = nums.size();
: if(n == 0) return 0;
: if(nums[0] != nums[n - 1])
: return n - 1;
: int i = 0;
: while(i < n - 1 && nums[i] == nums[i + 1]) i++;
: if(i == n - 1) return 0;
: return max(i + 1, n - 2 - i);

l******n
发帖数: 9344
28
你这个是从左边开始扫,也可以两边往中间扫
def indexDiff(vec):
n = len(vec)
if n <= 1:
return(0)

l, r = 0, n-1
while l < r:
if vec[l] != vec[r]:
return(r-l)
if vec[l+1] != vec[l] or vec[r-1] != vec[l]:
return(r-l-1)
else:
l += 1
r -= 1
return(0)

了。

【在 s***5 的大作中提到】
: 叔在最上面就指出两个指针往中间扫,居然有人说是错的,有人说还是要n^2,无语了。
: int maxIndexDiff(vector nums) {
: int n = nums.size();
: if(n == 0) return 0;
: if(nums[0] != nums[n - 1])
: return n - 1;
: int i = 0;
: while(i < n - 1 && nums[i] == nums[i + 1]) i++;
: if(i == n - 1) return 0;
: return max(i + 1, n - 2 - i);

n******g
发帖数: 2201
29
vec[l+1] 会指针越界,这种情况一般要加上
while l + 1 < r and vec[l+1] ...

【在 l******n 的大作中提到】
: 你这个是从左边开始扫,也可以两边往中间扫
: def indexDiff(vec):
: n = len(vec)
: if n <= 1:
: return(0)
:
: l, r = 0, n-1
: while l < r:
: if vec[l] != vec[r]:
: return(r-l)

l******n
发帖数: 9344
30
只要有两个元素就不会越界的。把前面的 n== 0条件, 改成n<=1就好了

【在 n******g 的大作中提到】
: vec[l+1] 会指针越界,这种情况一般要加上
: while l + 1 < r and vec[l+1] ...

l**********0
发帖数: 150
31
试试这个例子。[1,1,1,1,1,1,0,1,1,2,1]
目前只有一个人做对了。

了。

【在 s***5 的大作中提到】
: 叔在最上面就指出两个指针往中间扫,居然有人说是错的,有人说还是要n^2,无语了。
: int maxIndexDiff(vector nums) {
: int n = nums.size();
: if(n == 0) return 0;
: if(nums[0] != nums[n - 1])
: return n - 1;
: int i = 0;
: while(i < n - 1 && nums[i] == nums[i + 1]) i++;
: if(i == n - 1) return 0;
: return max(i + 1, n - 2 - i);

s***5
发帖数: 2136
32
难道答案不是6?难道叔的code在这个case不work?再度无语了。

【在 l**********0 的大作中提到】
: 试试这个例子。[1,1,1,1,1,1,0,1,1,2,1]
: 目前只有一个人做对了。
:
: 了。

a********r
发帖数: 218
33
答案是9, 25楼对的

【在 s***5 的大作中提到】
: 难道答案不是6?难道叔的code在这个case不work?再度无语了。
s***5
发帖数: 2136
34
还是应该用两个指针往中间扫,想着简化成一个指针但是miss了cases。
int maxIndexDiff(vector nums) {
int n = nums.size();
if(n <= 1) return 0;
if(nums[0] != nums[n - 1])
return n - 1;
int i = 0;
while(i < n - 1 && nums[i] == nums[i + 1]) i++;
if(i == n - 1) return 0;
int j = n - 1;
while(j > i + 1 && nums[j] == nums[j - 1]) j--;
return max(max(i + 1, n - 2 - i), max(j - 1, n - j));
}

【在 a********r 的大作中提到】
: 答案是9, 25楼对的
J*****4
发帖数: 1
35
就一个指针应该也可以,数组长度N
1i=0开始,比较是否与数组最后一个数不一样,如果不一样则返回max(i,N-1-i)
2将i加1,进入第一步
循环结束还没返回则返回0
因为不可能存在中间区段状况。
刚看到10楼算法和我一样。
我大概说下为何不存在中间区段状况,假设存在最大中间区段i,j,则意味这个中间区
段的左边k 。同理可以推出这个中间区段的右边m>j所有数字A[m]必然等于A[i]. 那么整个数组
第一
个和最后一个就必然不一样,但这同样违背最大中间段是i, j 的前提。所以不同的两个
数其中一个必然是第一个或最后一个。
m****w
发帖数: 1
36
for(i=0;i<=num.size()/2;i十十){
if(num[0]!=num[num.size()-i-1] ||
num[i]!=num[num.size()-1])
return num.size()-i-1;
}
return 0;
h**6
发帖数: 4160
37
数学上证明,i、j至少一个在两头。完事
1 (共1页)
进入JobHunting版参与讨论