K*****k 发帖数: 430 | 1 一个有序的整型数组,in place 删除重复的元素使得每个元素只出现一次。
练完后再仔细查查是否有bug。 |
A**u 发帖数: 2458 | 2 不错 这题写起来确实麻烦
【在 K*****k 的大作中提到】 : 一个有序的整型数组,in place 删除重复的元素使得每个元素只出现一次。 : 练完后再仔细查查是否有bug。
|
q****x 发帖数: 7404 | 3 这个不容易错吧。数组比链表好处理很多。
【在 K*****k 的大作中提到】 : 一个有序的整型数组,in place 删除重复的元素使得每个元素只出现一次。 : 练完后再仔细查查是否有bug。
|
k****n 发帖数: 369 | 4 这题我面A家时遇到过,关键代码就一行
【在 K*****k 的大作中提到】 : 一个有序的整型数组,in place 删除重复的元素使得每个元素只出现一次。 : 练完后再仔细查查是否有bug。
|
A**u 发帖数: 2458 | 5 容易错吧
需要再把多余的元素删掉,后面的元素补上空位
【在 q****x 的大作中提到】 : 这个不容易错吧。数组比链表好处理很多。
|
q****x 发帖数: 7404 | 6 不存在"删掉",实际是移动。当然如果是字符串,还要考虑结束符;动态数组要resize。
【在 A**u 的大作中提到】 : 容易错吧 : 需要再把多余的元素删掉,后面的元素补上空位
|
f*******t 发帖数: 7549 | 7 大致应该是这样,一些边界条件需要考虑。
int pos = 0;
for(int i = 1; i < n; i++) {
if(A[i] == A[pos])
continue;
else
pos++;
A[pos] = A[i];
}
}
|
K*****k 发帖数: 430 | 8 有没有加速的可能?
比如
1 2 3 3 ... 3 4 4 5
其中有10000个3在那里,能否用到二分查找什么的一下子跳到最后一个3呢?
【在 f*******t 的大作中提到】 : 大致应该是这样,一些边界条件需要考虑。 : int pos = 0; : for(int i = 1; i < n; i++) { : if(A[i] == A[pos]) : continue; : else : pos++; : A[pos] = A[i]; : } : }
|
b******n 发帖数: 4509 | 9 int deDup (int a[], int n) {
for (int i = 0, j = 0; j < n; j++) {
if (a[j] != a[i])
a[++i] = a[j];
}
return i;
}
【在 K*****k 的大作中提到】 : 一个有序的整型数组,in place 删除重复的元素使得每个元素只出现一次。 : 练完后再仔细查查是否有bug。
|
e*********l 发帖数: 136 | 10 if (xxx ) continue;
else
可以写成 if (!xxx) 或者if (xxx) continue;
这样简洁很多
而且貌似应该是
else{
pos ++;
A[pos] = A[i];
}
【在 f*******t 的大作中提到】 : 大致应该是这样,一些边界条件需要考虑。 : int pos = 0; : for(int i = 1; i < n; i++) { : if(A[i] == A[pos]) : continue; : else : pos++; : A[pos] = A[i]; : } : }
|
|
|
K*****k 发帖数: 430 | 11 好像是,这个else就多余了,前面都已经continue了。
经常看到同一题同算法的写法,有的写起来就短小精悍,而有的则拖泥带水。我觉得白
板的的代码长度是一定要设法控制的。
【在 e*********l 的大作中提到】 : if (xxx ) continue; : else : 可以写成 if (!xxx) 或者if (xxx) continue; : 这样简洁很多 : 而且貌似应该是 : else{ : pos ++; : A[pos] = A[i]; : }
|
q****x 发帖数: 7404 | 12 清晰第一,简洁第二。
【在 b******n 的大作中提到】 : int deDup (int a[], int n) { : for (int i = 0, j = 0; j < n; j++) { : if (a[j] != a[i]) : a[++i] = a[j]; : } : return i; : }
|
e*********l 发帖数: 136 | 13 这个应该是编译不过
i的生命周期问题
【在 b******n 的大作中提到】 : int deDup (int a[], int n) { : for (int i = 0, j = 0; j < n; j++) { : if (a[j] != a[i]) : a[++i] = a[j]; : } : return i; : }
|
K*****k 发帖数: 430 | 14 眼尖的面试官会发现,有的还不当场告诉你,事后写在报告里。
【在 e*********l 的大作中提到】 : 这个应该是编译不过 : i的生命周期问题
|
z***e 发帖数: 209 | 15 int delRep(int* nArr, int sz)
{
if(sz<0 || nArr==NULL) return -1;
if(sz==1) return 1;
int i, j;
for(i=0, j=1; j!=sz; ++j)
{
if(nArr[j]!=nArr[i]) nArr[++i]=nArr[j];
}
return i+1;
} |
z***e 发帖数: 209 | 16 ft,翘了.... if(sz<=0 || nArr==NULL) return -1; |
z***e 发帖数: 209 | 17 用个threshold判断一下,如果有很多冗余.
if(nArrSize>1000*nArr[nArrSize-1])
{
int* BS(int* nArr, int beg, int end)
{
int midup=midlow=reserveup=reservelow=0;
while(beg<=end)
{
reserveup = beg;
midup = (beg+end)/2;
if(num==nArr[midup]) beg=midup+1;
else break;
}
while(beg>=end)
{
reservelow = end;
midup = (beg+end)/2;
if(num==nArr[midup]) end=midup-1;
else break;
}
int* pInt = new int[2];
pInt[0]=reserveup;
pInt[1]=reservelow;
return pInt;
}
}
这中间 10000个数字,如果每个数值的个数均匀分布,
比如说 1000个2, 1000个3, 1000个4 之类的.要讨论了.
【在 K*****k 的大作中提到】 : 有没有加速的可能? : 比如 : 1 2 3 3 ... 3 4 4 5 : 其中有10000个3在那里,能否用到二分查找什么的一下子跳到最后一个3呢?
|
l**s 发帖数: 421 | |
s****a 发帖数: 528 | 19 int deDup(int *A, int N)
{
int idxChecked = 0;
int idxUnchecked = 1;
while (idxUnchecked < N)
{
if (A[idxChecked] < A[idxUnchecked])
A[++idxChecked] = A[idxUnchecked];
idxUnchecked ++;
}
return idxChecked;
} |
i**********e 发帖数: 1145 | 20 这编译没什么问题,i 会返回一个 copy,不会有生命周期的问题,但可能会有大姨妈
周期的问题。
除非返回的是一个指向一个在函数里生成的数组,那就大问题啦。
不过话说回来 他代码有 bug,返回的应该是 i+1 而不是 i.
【在 e*********l 的大作中提到】 : 这个应该是编译不过 : i的生命周期问题
|
q****x 发帖数: 7404 | 21 out of scope.
【在 i**********e 的大作中提到】 : 这编译没什么问题,i 会返回一个 copy,不会有生命周期的问题,但可能会有大姨妈 : 周期的问题。 : 除非返回的是一个指向一个在函数里生成的数组,那就大问题啦。 : 不过话说回来 他代码有 bug,返回的应该是 i+1 而不是 i.
|
i**********e 发帖数: 1145 | 22 yeah, you are right, just saw that.
【在 q****x 的大作中提到】 : out of scope.
|