b**m 发帖数: 1466 | 1 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了
删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度
就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。 |
m**********j 发帖数: 8645 | 2 这是种族之争,跟个人的好差没冠希。
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
h*d 发帖数: 19309 | 3 上面为啥要给offer呢?里面有老印强推?
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
l*****a 发帖数: 14598 | 4 他这个code work吗?去eclipse运行一下看看
input不需要判空吗?
参数是不是定义成List更合适一点
remove的参数不转成Obejct就变成了remove(index)了吧
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
b**m 发帖数: 1466 | 5 我觉得是公司烂,只招contractor
头是中国人,头的头是老美。
【在 h*d 的大作中提到】 : 上面为啥要给offer呢?里面有老印强推?
|
l*****a 发帖数: 14598 | 6 问题是这code压根不work
remove后size变了,index变了,更不要说现在直接call list.remove(-*)了
直接就indexOutOfBoundsException了
【在 b**m 的大作中提到】 : 我觉得是公司烂,只招contractor : 头是中国人,头的头是老美。
|
e********3 发帖数: 18578 | 7 这是错的实现,因为删除以后后面的元素就往前提了,这样i++以后其实跳过了一个元
素。。。
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
x****o 发帖数: 29677 | 8 老中fresh比他强的多的是吧,为什么非给烙印OFFER? |
e********3 发帖数: 18578 | 9 communication skill.
【在 x****o 的大作中提到】 : 老中fresh比他强的多的是吧,为什么非给烙印OFFER?
|
e********3 发帖数: 18578 | 10 +1,这三哥的基本功太不扎实了,还敢说自己写过10年Java。
【在 l*****a 的大作中提到】 : 问题是这code压根不work : remove后size变了,index变了,更不要说现在直接call list.remove(-*)了 : 直接就indexOutOfBoundsException了
|
|
|
x****o 发帖数: 29677 | 11
关键是头有一个是老中,那么多老中找工作,junior一抓一把,给个老中就不行啊
【在 e********3 的大作中提到】 : communication skill.
|
e********3 发帖数: 18578 | 12 头是中国人还招这么烂的阿三真心说不过去。
【在 x****o 的大作中提到】 : : 关键是头有一个是老中,那么多老中找工作,junior一抓一把,给个老中就不行啊
|
s*****p 发帖数: 108 | 13 复杂度是指空间吧?
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
h*d 发帖数: 19309 | 14 确实说不过去
【在 e********3 的大作中提到】 : 头是中国人还招这么烂的阿三真心说不过去。
|
T*****u 发帖数: 7103 | |
j****e 发帖数: 12067 | 16 连我这不写代码的都一下子就知道问题了,把这个offer给我吧。。。。。
【在 l*****a 的大作中提到】 : 问题是这code压根不work : remove后size变了,index变了,更不要说现在直接call list.remove(-*)了 : 直接就indexOutOfBoundsException了
|
r****c 发帖数: 2585 | 17 arraylist 还remove啊,马上要改呀,linkedlist |
l**s 发帖数: 421 | 18
从前往后应该也行吧,就是遇到负数的时候index得退一个
【在 T*****u 的大作中提到】 : 要从后往前吧
|
G**C 发帖数: 365 | 19 Time O(n), space O(1)
ArrayList removeNegative(ArrayList a) {
if (a == null)
return a;
int nextNegative = 0, nextNonNegative = 0;
while (nextNegative < a.size()) {
if (a.get(nextNegative) >= 0) {
nextNegative++;
continue;
}
nextNonNegative = Math.max(nextNonNegative, nextNegative + 1);
while (nextNonNegative < a.size() && a.get(nextNonNegative) < 0) {
nextNonNegative++;
}
if (nextNonNegative == a.size()) {
break;
} else {
int tmp = a.get(nextNegative);
a.set(nextNegative, a.get(nextNonNegative));
a.set(nextNonNegative, tmp);
nextNegative++;
nextNonNegative++;
}
}
if (nextNegative < a.size()) {
a.subList(nextNegative, a.size()).clear();
}
return a;
} |
l*****a 发帖数: 14598 | 20 据信
【在 G**C 的大作中提到】 : Time O(n), space O(1) : ArrayList removeNegative(ArrayList a) { : if (a == null) : return a; : int nextNegative = 0, nextNonNegative = 0; : while (nextNegative < a.size()) { : if (a.get(nextNegative) >= 0) { : nextNegative++; : continue; : }
|
|
|
G**C 发帖数: 365 | 21 大牛请指教!
【在 l*****a 的大作中提到】 : 据信
|
l*****a 发帖数: 14598 | 22 if(input==null) return null;
for(int i=input.size()-1;i>=0;i--) {
int element=input.get(i);
if(element<0) input.remove(i);
}
return input;
【在 G**C 的大作中提到】 : 大牛请指教!
|
G**C 发帖数: 365 | 23 大牛,你的版本也work,且适用于linkedlist,但remove开销有点大。
我的版本追求性能,因此复杂了些,主要针对interviewer的口味。
我还准备了一个生产代码版本,基于Guava库.
ArrayList removeNegative2(ArrayList a) {
if (a == null)
return a;
return Lists.newArrayList(Iterables.filter(a, new Predicate() {
@Override public boolean apply(Integer input) {
return input >= 0;
}
}));
}
【在 l*****a 的大作中提到】 : if(input==null) return null; : for(int i=input.size()-1;i>=0;i--) { : int element=input.get(i); : if(element<0) input.remove(i); : } : return input;
|
l*********1 发帖数: 936 | 24 这么简单的问题写这么长Code?
搞两个指针就完了吧。
【在 G**C 的大作中提到】 : Time O(n), space O(1) : ArrayList removeNegative(ArrayList a) { : if (a == null) : return a; : int nextNegative = 0, nextNonNegative = 0; : while (nextNegative < a.size()) { : if (a.get(nextNegative) >= 0) { : nextNegative++; : continue; : }
|
l*****a 发帖数: 14598 | 25
=======================
这个是怎么知道的呢?
另外面试中搞那些不是通俗易懂的东西很容易悲剧的
{
【在 G**C 的大作中提到】 : 大牛,你的版本也work,且适用于linkedlist,但remove开销有点大。 : 我的版本追求性能,因此复杂了些,主要针对interviewer的口味。 : 我还准备了一个生产代码版本,基于Guava库. : ArrayList removeNegative2(ArrayList a) { : if (a == null) : return a; : return Lists.newArrayList(Iterables.filter(a, new Predicate() { : @Override public boolean apply(Integer input) { : return input >= 0; : }
|
l*********1 发帖数: 936 | 26 do you know how expensive remove is?
【在 l*****a 的大作中提到】 : if(input==null) return null; : for(int i=input.size()-1;i>=0;i--) { : int element=input.get(i); : if(element<0) input.remove(i); : } : return input;
|
l*****a 发帖数: 14598 | 27 讲讲吧。
看起来下一个版本的java应该把它删掉了
【在 l*********1 的大作中提到】 : do you know how expensive remove is?
|
G**C 发帖数: 365 | 28 是两个指针 nextNegative 和nextNonNegative.
退出大循环后,从[nextNegative, size())都一并truncate.
请指教简化tips.
【在 l*********1 的大作中提到】 : 这么简单的问题写这么长Code? : 搞两个指针就完了吧。
|
l*********1 发帖数: 936 | 29 我不太写java code, 不过思路是这样
一个source 指针,每次加一,
一个dest 指针,只有non-negative 才加一,
从source copy 到 destination,
最后call removeRange one time.
code (c++ style) is:
source = 0;
dest = 0;
while (source < array.size()) {
if (array[source] >= 0 ){
array[dest++] = array[source];
}
++source;
}
array.removeRange(dest, source);
you should check boundary cases:
1) array is empty
2) every element is negative
3) every element s positive
【在 G**C 的大作中提到】 : 是两个指针 nextNegative 和nextNonNegative. : 退出大循环后,从[nextNegative, size())都一并truncate. : 请指教简化tips.
|
G**C 发帖数: 365 | 30 对,基本差不多的思路,唯一的优化是
dest永远比src大,因此每次搜索dst时候从Max(src, last dst)开始就可以了。
【在 l*********1 的大作中提到】 : 我不太写java code, 不过思路是这样 : 一个source 指针,每次加一, : 一个dest 指针,只有non-negative 才加一, : 从source copy 到 destination, : 最后call removeRange one time. : code (c++ style) is: : source = 0; : dest = 0; : while (source < array.size()) { : if (array[source] >= 0 ){
|
|
|
a******d 发帖数: 896 | 31 头是中国人还招这么烂的阿三真心说不过去。
lz 推荐个小中吧,肯定秒杀啊。
【在 b**m 的大作中提到】 : 我觉得是公司烂,只招contractor : 头是中国人,头的头是老美。
|
l*********1 发帖数: 936 | 32 dst 永远比src 小吧。
说老实话,我面试过别人,你的code 那么写肯定挂了,没有可读性
以后面试时尽量code 简洁易懂。
【在 G**C 的大作中提到】 : 对,基本差不多的思路,唯一的优化是 : dest永远比src大,因此每次搜索dst时候从Max(src, last dst)开始就可以了。
|
l*********1 发帖数: 936 | 33 arraylist 里 remove 一个元素是O(N)操作。
想想为什么是O(N), 能不能做的更好。
【在 l*****a 的大作中提到】 : 讲讲吧。 : 看起来下一个版本的java应该把它删掉了
|
l*********1 发帖数: 936 | 34 你东家是哪家阿?
【在 b**m 的大作中提到】 : 凭心而论我遇到的三个钟还有不少不错的,只是我现在东家太烂了 : 删除一个arraylist的所有负数给俺这样的代码,和O(1)的复杂度 : 就这样头和头的头还要给一个junior level的offer,尼玛都10年java经验了。
|
x****7 发帖数: 86 | 35 这个。。跟最后一个换一下,然后再remove最后一个就完了呗。 |
b**m 发帖数: 1466 | 36 linkedlist 按照index删除也很慢。
{
【在 G**C 的大作中提到】 : 大牛,你的版本也work,且适用于linkedlist,但remove开销有点大。 : 我的版本追求性能,因此复杂了些,主要针对interviewer的口味。 : 我还准备了一个生产代码版本,基于Guava库. : ArrayList removeNegative2(ArrayList a) { : if (a == null) : return a; : return Lists.newArrayList(Iterables.filter(a, new Predicate() { : @Override public boolean apply(Integer input) { : return input >= 0; : }
|
s******e 发帖数: 493 | 37 Confused... r u writing it in java?
iterator.remove will do all the tricks. |
s******7 发帖数: 1758 | 38 同意楼上,用iterator就可以了
Iterator iter = arrayList.iterator();
while(iter.hasNext())if(iter.next()<0)iter.remove();
搞什么双指针,什么遇到负的退一个都太复杂了 |
z*********e 发帖数: 10149 | 39 同意楼上两位,iterator是容器类需要删除元素的标准做法吧 |
c****p 发帖数: 6474 | |
|
|
j********x 发帖数: 2330 | 41 哥们你不知道iterator啥东西么?。。。
这种写法评价比lz说的那个烙印还要差啊。。。
【在 G**C 的大作中提到】 : Time O(n), space O(1) : ArrayList removeNegative(ArrayList a) { : if (a == null) : return a; : int nextNegative = 0, nextNonNegative = 0; : while (nextNegative < a.size()) { : if (a.get(nextNegative) >= 0) { : nextNegative++; : continue; : }
|
b**m 发帖数: 1466 | |
c**********y 发帖数: 38 | 43 先把不是负数的copy到是负数的位置,最后把剩余的remove掉,这样应该是最快的,小
弟就在找junior的职位,可惜了一个offer,三哥们说10年工作经验的意思就是在谦虚
的说他刚毕业在找junior的工作 |