ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: willin2000

[Excel 函数与公式] [开_107]字符串末尾连续个数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-10-3 00:59 | 显示全部楼层

再来一个MMULT错行新解法,86字符,数组公式

{=MMULT(LARGE((MID(A2,ROW($1:$98),1)<>MID(A2,ROW($2:$99),1))*ROW($1:$98),{1,2}),{1;-1})}

QUOTE:

用LARGE(,,{1,2})找出连续字符串的开始和结束,是新方法.  评2分.

其实在不需要求得数组结果情况的求和,可以不用MMULT, 直接=SUM(LARGE((MID(A2,ROW($1:$98),1)<>MID(A2,ROW($2:$99),1))*ROW($1:$98),{1,2})*{1,-1})                      -willin2000

[此贴子已经被willin2000于2007-10-3 10:04:13编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 01:17 | 显示全部楼层

思路如潮,再玩一个FREQUENCY的解法,供大家指正,100字符,数组

{=LOOKUP(LEN(A2),FREQUENCY(ROW($1:$98),IF(MID(A2,ROW($1:$98),1)<>MID(A2,ROW($2:$99),1),ROW($1:$98))))}

QUOTE:
由于FREQUENCY产生的是无序的结果, 这样在一定情况下,LOOKUP的结果无法确定的. 

可以根据函数版LOOKUP查找策略贴里面的分支情况来验证. 就是一些字符串时会出错.

我没有用改变字符串的方式来模拟让LOOKUP走不同路径, 我改变了总数比如"EH从无到兴旺旺旺旺旺旺":

=LOOKUP(LEN(A7),FREQUENCY(ROW($1:$20),IF(MID(A7,ROW($1:$20),1)<>MID(A7,ROW($2:$21),1),ROW($1:$20)))),

"他1100000000002007000"

=LOOKUP(LEN(A4),FREQUENCY(ROW($1:$30),IF(MID(A4,ROW($1:$30),1)<>MID(A4,ROW($2:$31),1),ROW($1:$30))))

  -willin200

[此贴子已经被willin2000于2007-10-3 10:24:53编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 01:28 | 显示全部楼层
QUOTE:
以下是引用xcd在2007-10-3 1:17:25的发言:

思路如潮,再玩一个FREQUENCY的解法,供大家指正,100字符,数组

{=LOOKUP(LEN(A2),FREQUENCY(ROW($1:$98),IF(MID(A2,ROW($1:$98),1)<>MID(A2,ROW($2:$99),1),ROW($1:$98))))}

此解法甚有意思,先求出段频率数后,再充分利用了LOOKUP的二分法查找特性,找出倒数第二个数。

TA的精华主题

TA的得分主题

发表于 2007-10-3 01:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

78个字符:

=LEN(" "&A2)-MATCH(2,1/(MID(" "&A2,ROW(INDIRECT("1:"&LEN(A2))),1)<>RIGHT(A2)))  ——数组公式

QUOTE:
使用" "&A2来解决只有一种字符的字符串情况,很巧妙,使得用MATCH的方法比用MAX的短了很多. 评2分 -willin2000

[此贴子已经被willin2000于2007-10-3 9:49:58编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 12:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

再来一个,73个字符:

=SUM(--(SUBSTITUTE(RIGHT(A2,ROW(INDIRECT("1:"&LEN(A2)))),RIGHT(A2),)=""))  ——数组公式

QUOTE:

利用了只有一种字符的子字符串的特征来计算个数, 是个新方法.

有可能在上面解题过程中受的的启发吧.只是猜测, 哈哈 -willin2000

[此贴子已经被willin2000于2007-10-3 22:27:07编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 12:50 | 显示全部楼层

缩短公式,但运算速度变慢了,62个字符,应该是目前最短的公式了:

=SUM(--(SUBSTITUTE(RIGHT(" "&A2,ROW($1:$999)),RIGHT(A2),)="")) ——数组公式

山菊花超版的公式短一个字符:=COUNT(0/(RIGHT(A2,ROW($1:$999))=REPT(RIGHT(A2),ROW($1:$999)))) ,63个字符

QUOTE:

这和楼上的公式是同一思路, 字符有减少,原则上也不能算优化,和下面的答复一起考虑再加1分. -willin2000

[此贴子已经被willin2000于2007-10-3 21:36:58编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 13:14 | 显示全部楼层

呵呵,这个更短,60个字符:

=MATCH("",SUBSTITUTE(RIGHT(" "&A2,ROW($1:$999)),RIGHT(A2),))  ——数组公式

QUOTE:

和楼上的两个公式,总体思路类似, 不过这是利用了MATCH的查找特性的新方法, 本来可以加1分, 由于总规则规定"一个帖子最高得分上限为5分", 所以不再加分, 谢谢aichong提供的解法. -willin2000

[此贴子已经被willin2000于2007-10-3 21:33:24编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 13:19 | 显示全部楼层

=SUM(N(A1&RIGHT(A1)=SUBSTITUTE(A1,RIGHT(A1),RIGHT(A1)&RIGHT(A1),ROW(INDIRECT("1:"&LEN(A1))))))

=SUM(N(A1&RIGHT(A1)=SUBSTITUTE(A1,RIGHT(A1),REPT(RIGHT(A1),2),ROW(INDIRECT("1:"&LEN(A1))))))

信息理论上讲,这个问题我们就是要解决两个问题,一个是最末尾的是个字符,二是非最末字符,抓住这两个点问题就解决了。所以我虽然没仔细看过大家的公式,但从信息论上讲就是要解决上面两个问题。我这个思路是 用字符串全息 的特点来同时解决两个问题。

希望给分,呵呵

QUOTE:

"一个是最末尾的是个字符,二是非最末字符,抓住这两个点问题就解决了", 不完全是这个特征, 所以前面的解题方法不能不看, 许多思路在实际应用中还是十分有用的.如果早跳出只找这种特征的思路,说不定你也能想出前面的一些解法了哦.

公式等价于=SUM(N(A2&RIGHT(A2)=SUBSTITUTE(A2,RIGHT(A2),REPT(RIGHT(A2),2),ROW($1:$99))))
18楼的是   =SUM(N(LEFT(A4,LEN(A4)-1)=SUBSTITUTE(A4,RIGHT(A4),,ROW($1:$99))))

和18楼的答案基本思路还是一样. 但在总体上来说想法和前面的有所不同, 鼓励加1分(加在下面的贴上了) -willin2000

[此贴子已经被willin2000于2007-10-5 10:34:55编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 13:53 | 显示全部楼层

len(row(indirect("1:"&len(a1))))-len(ROW($1:$999)))>0

我觉得用这样的方式来缩短字符感觉不是特别的...此处省略一个形容词!

大家觉得呢

QUOTE:

同意胡剑0227的观点, 其实前者更具通用性,虽然字符个数多,

而作为竞赛题,主要挖掘各种可能的方法,以便大家在碰到具体问题时能有选择针对性的使用.

也因此大家的答案不是一定要优于前面的答案才能得分. -willin2000

汗,点错加分位置了, 本分是为楼上的公式加的.-willin2000

[此贴子已经被willin2000于2007-10-3 23:22:31编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-3 22:57 | 显示全部楼层
QUOTE:
以下是引用xcd在2007-10-3 1:17:25的发言:

思路如潮,再玩一个FREQUENCY的解法,供大家指正,100字符,数组

{=LOOKUP(LEN(A2),FREQUENCY(ROW($1:$98),IF(MID(A2,ROW($1:$98),1)<>MID(A2,ROW($2:$99),1),ROW($1:$98))))}

QUOTE:
由于FREQUENCY产生的是无序的结果, 这样在一定情况下,LOOKUP的结果无法确定的. 

可以根据函数版LOOKUP查找策略贴里面的分支情况来验证. 就是一些字符串时会出错.

我没有用改变字符串的方式来模拟让LOOKUP走不同路径, 我改变了总数比如"EH从无到兴旺旺旺旺旺旺":

=LOOKUP(LEN(A7),FREQUENCY(ROW($1:$20),IF(MID(A7,ROW($1:$20),1)<>MID(A7,ROW($2:$21),1),ROW($1:$20)))),

"他1100000000002007000"

=LOOKUP(LEN(A4),FREQUENCY(ROW($1:$30),IF(MID(A4,ROW($1:$30),1)<>MID(A4,ROW($2:$31),1),ROW($1:$30))))

  -willin200


红色部份未能全部理解,也再次对"EH从无到兴旺旺旺旺旺旺"与"他1100000000002007000"进行测试,结果为6与3

如能得版主的再次赐教,感激不尽部份未能全部理解,

QUOTE:
赐教不敢当, 大家相互探讨罢了.

xcd兄可能没注意到公式里我把99改了,这用来模拟LOOKUP第一次判断的位置,第二次的位置....., 这也和增加字符串个数,或改变字符串中间(和最后是非连续的)和最后一个字符相同个数的数量一样,都是改变判断路径, 用新的路径上面两个公式的结果是8和10.

LOOKUP的路径请参考:

http://club.excelhome.net/viewthread.php?tid=113915&replyID=840887&skin=1

                                                                                                                                                                     -willin2000

[此贴子已经被willin2000于2007-10-3 23:43:12编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 07:00 , Processed in 0.046181 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表