不知是否正确,请冻大师指教了,
假设数据区域不存在空白单元格;
因为结果区域行数最大范围不可能超过源区域行数的2倍,假设公式只在数据区域行数的2倍内下拉;
189字符
=INDEX(A:A,RIGHT(LARGE(MMULT(COUNTIF(A:A,{"=",">="}&A$1:A$20)*10^{9,7},{1;1})+IF({1,0},9*10^5+ROW($1:$20),IF(COUNTIF(OFFSET(A$1,,,ROW($1:$20)),A$1:A$20)<3,4^8,-(10^12+4^8))),ROW(A1)),5))&""
193字符
=INDEX(A:A,RIGHT(LARGE(COUNTIF(A:A,A$1:A$20)*10^9+COUNTIF(A:A,">="&A$1:A$20)*10^7+IF({1,0},9*10^5+ROW($1:$20),IF(COUNTIF(OFFSET(A$1,,,ROW($1:$20)),A$1:A$20)<3,4^8,-(10^12+4^8))),ROW(A1)),5))&""
数组公式
上述公式不适合数据列中同时包含数字与字符单元格的情况,COUNTIF(A:A,">="&A$1:A$20)不能正确判别数值与字符的大小,且运算效率低下,改进一下:
226字符
=INDEX(A:A,RIGHT(LARGE(COUNTIF(A$1:A$20,A$1:A$20)*10^9+MMULT(N(A$1:A$20<=TRANSPOSE(A$1:A$20)),ROW($1:$20)^0)*10^7+IF({1,0},9*10^5+ROW($1:$20),IF(COUNTIF(OFFSET(A$1,,,ROW($1:$20)),A$1:A$20)<=2,4^8,-(10^12+4^8))),ROW(A1)),5))&""
注:上面2个公式虽然较短,但有不足,缺点是不能下拉到源数据行数2倍以外的地方,拉到41行时会出错(实际上41行开始不会有结果了);
以下公式可继续下拉;
比较通用一点的公式,246字符
=IF(ROW()>2*COUNTA(A:A),"",INDEX(A:A,RIGHT(LARGE(COUNTIF(A$1:A$20,A$1:A$20)*10^9+MMULT(N(A$1:A$20<=TRANSPOSE(A$1:A$20)),ROW($1:$20)^0)*10^7+IF({1,0},9*10^5+ROW($1:$20),(COUNTIF(OFFSET(A$1,,,ROW($1:$20)),A$1:A$20)>2)*-(10^12)+4^8),ROW(A1)),5)))&""
注:此公式源数据多于17232个时可能不会正确插入空行;
不太可能出错的公式,318字符
=IF(ROW()>=COUNTA(A:A)+2*SUM(1/COUNTIF(A$1:A$20,A$1:A$20))-SUM(N(COUNTIF(A$1:A$20,A$1:A$20)=1)),"",INDEX(A:A,RIGHT(LARGE(COUNTIF(A$1:A$20,A$1:A$20)*10^9+MMULT(N(A$1:A$20<=TRANSPOSE(A$1:A$20)),ROW($1:$20)^0)*10^7+IF({1,0},9*10^5+ROW($1:$20),(COUNTIF(OFFSET(A$1,,,ROW($1:$20)),A$1:A$20)>2)*-(10^12)+4^8),ROW(A1)),5)))&""
题后有感:
花了三天时间,很不轻松地做了几个答案,也不知道是否能够弄上1分,此题对我来说难度虽然较高,但实用性强,富有创意,能激发他人思维,在此对冻大师的辛勤劳作深表感谢,虽然初次出题,已经可见冻大师的精湛技艺,相信此题仅是冻大师高超技术的冰山之一角,如果能在出题时把所有情况考虑周全些,把答题要求说明更详细点,将会有更多坛友积极响应,踊跃参与的。
[ 本帖最后由 jyhxr 于 2009-10-18 15:11 编辑 ] |