ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 338. 计数问题,求一个更优算法解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-20 13:07 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 micch 于 2024-4-23 11:27 编辑


搜算法遇到一个题,看上去直接循环很简单的题,用什么算法好呢?有没有vba的写法,学习一下。

49963621d6ffa7f90e0304dca8351e4.png
先用暴力循环写个基础版,很粗浅的解法。
代码:
  1. Sub Main()
  2.     Dim ar, br, cr(9) As Long
  3.     Dim i, j, k
  4.    
  5.     ar = [{1,10;44,497;346,542;1199,1748;1496,1403;1004,503;1714,190;1317,854;1976,494;1001,1960}]
  6.     ReDim br(1 To UBound(ar))
  7.    
  8.     For i = 1 To UBound(ar)
  9.         br(i) = cr
  10.         If ar(i, 1) > ar(i, 2) Then
  11.             k = ar(i, 1): ar(i, 1) = ar(i, 2): ar(i, 2) = k
  12.         End If
  13.         For j = ar(i, 1) To ar(i, 2)
  14.             For k = 1 To Len(j)
  15.                 br(i)(Mid(j, k, 1)) = br(i)(Mid(j, k, 1)) + 1
  16.             Next
  17.         Next
  18.     Next
  19.    
  20.         For j = 0 To 9
  21.             s = s & vbTab & vbTab & j
  22.         Next
  23.         Debug.Print vbTab & vbTab & vbTab & s
  24.     For i = 1 To UBound(ar)
  25.         s = ar(i, 1) & "~" & ar(i, 2) & ":" & vbTab
  26.         For j = 0 To 9
  27.             s = s & vbTab & vbTab & br(i)(j)
  28.         Next
  29.         Debug.Print s
  30.     Next
  31. End Sub
复制代码


输出结果:
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-20 13:56 | 显示全部楼层
个人的处理,循环一组数,mid(数字),字典(1-9)的个数

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-20 14:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
循环是绕不开的
image.png
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-20 15:57 | 显示全部楼层
嗯,正则替换完函数返回长度。这算是用内置功能解决问题了。

有没有,内置功能以外,基础代码的方法呢。主要是不知道什么算法合适,递归搜索或者动态规划,似乎都可以,还在研究怎么写,没写好。

TA的精华主题

TA的得分主题

发表于 2024-4-20 16:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看到又是变量+数组、又是组件,循环套循环的复杂冗长代码,真让人头大,试着用SQL 1条诗句,全部搞定。
数字统计.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-20 19:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.png 表示参与一下

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-20 21:52 | 显示全部楼层
用函数替换计算长度,是比较省事,不过这种练习题应该有更多的方法,比如在跨度很大的整数进行统计的方法

我也用replace写一个吧
  1. Sub Main3()
  2.     ar = [{1,10;44,497;346,542;1199,1748;1496,1403;1004,503;1714,190;1317,854;1976,494;1001,1960}]
  3.     For i = 1 To 10
  4.         Debug.Print fun(ar(i, 1), ar(i, 2))
  5.     Next
  6. End Sub
  7. Function fun(a, b)
  8.     Dim br(9) As String
  9.     For i = a To b Step IIf(a > b, -1, 1)
  10.     For j = 0 To 9
  11.         br(j) = Val(br(j)) + Len(i) - Len(Replace(i, j, ""))
  12.     Next
  13.     Next
  14.     fun = a & "~" & b & " : " & Join(br)
  15. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-20 23:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 cnmlgb9998 于 2024-4-20 23:44 编辑
  1. let
  2.       源 = Excel.CurrentWorkbook(){[Name = "FromArray_1"]}[Content],
  3.       更改的类型 = Table.TransformColumnTypes(源, {{"Column1", Int64.Type}, {"Column2", Int64.Type}}),
  4.       lst = Table.ToRows(更改的类型),
  5.       自定义1 = Table.FromRows(
  6.             List.Transform(
  7.                   lst,
  8.                   each List.Transform(
  9.                         {"0" .. "9"},
  10.                         (m) =>
  11.                               List.Count(
  12.                                     List.Select(
  13.                                           List.Accumulate(
  14.                                                 {_{0} .. _{1}},
  15.                                                 {},
  16.                                                 (x, y) => x & Text.ToList(Text.From(y))
  17.                                           ),
  18.                                           (n) => m = n
  19.                                     )
  20.                               )
  21.                   )
  22.             ),
  23.             {"0" .. "9"}
  24.       )
  25. in
  26.       自定义1
复制代码

用PQ 解决。。。。。。。。。。。。。。。。。。。。。。。。。。


学了4个月的PQ,现在基本能 一口气把代码全敲出来了。。。
捕获.PNG

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-20 23:26 | 显示全部楼层
  1. let
  2.       源 = Excel.CurrentWorkbook(){[Name = "FromArray_1"]}[Content],
  3.       更改的类型 = Table.TransformColumnTypes(源, {{"Column1", Int64.Type}, {"Column2", Int64.Type}}),
  4.       lst = Table.ToRows(更改的类型),
  5.       自定义1 = Table.Combine(
  6.             List.Transform(
  7.                   lst,
  8.                   (m) =>
  9.                         Table.FromRows(
  10.                               {
  11.                                     List.Transform(
  12.                                           Table.ToColumns(
  13.                                                 Table.Combine(
  14.                                                       List.Accumulate(
  15.                                                             {m{0} .. m{1}},
  16.                                                             {},
  17.                                                             (x, y) =>
  18.                                                                   x
  19.                                                                         & {
  20.                                                                               [
  21.                                                                                     a = List.Zip(
  22.                                                                                           List.Transform(
  23.                                                                                                 {
  24.                                                                                                       "0"
  25.                                                                                                             .. "9"
  26.                                                                                                 },
  27.                                                                                                 each
  28.                                                                                                       {
  29.                                                                                                             _,
  30.                                                                                                             List.Count(
  31.                                                                                                                   List.Select(
  32.                                                                                                                         Text.ToList(
  33.                                                                                                                               Text.From(
  34.                                                                                                                                     y
  35.                                                                                                                               )
  36.                                                                                                                         ),
  37.                                                                                                                         (
  38.                                                                                                                               n
  39.                                                                                                                         ) =>
  40.                                                                                                                               n
  41.                                                                                                                                     = _
  42.                                                                                                                   )
  43.                                                                                                             )
  44.                                                                                                       }
  45.                                                                                           )
  46.                                                                                     ),
  47.                                                                                     b
  48.                                                                                           = Table.FromRecords(
  49.                                                                                           {
  50.                                                                                                 Record.FromList(
  51.                                                                                                       a{
  52.                                                                                                             1
  53.                                                                                                       },
  54.                                                                                                       a{
  55.                                                                                                             0
  56.                                                                                                       }
  57.                                                                                                 )
  58.                                                                                           }
  59.                                                                                     )
  60.                                                                               ][b]
  61.                                                                         }
  62.                                                       )
  63.                                                 )
  64.                                           ),
  65.                                           List.Sum
  66.                                     )
  67.                               },
  68.                               {"0" .. "9"}
  69.                         )
  70.             )
  71.       )
  72. in
  73.       自定义1
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-20 23:46 | 显示全部楼层
代码优化了一下。。。。。。。。。。。。。。。。。。
捕获.PNG
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 10:57 , Processed in 0.041889 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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