简介

为什么要用GoAccess?

GoAccess 被设计成快速的并基于终端的日志分析工具。其核心理念是不需要通过 Web 浏览器就能快速分析并实时查看 Web 服务器的统计数据(这对于需要使用 SSH 来对访问日志进行快速分析或者就是喜欢在终端环境下工作的人来说是超赞的)。

终端输出仅仅是默认的输出方式,GoAccess 还支持生成完整的实时 HTML 报告(这对分析、监控以及数据可视化都是极好的),以及 JSON 和 CSV 格式的报告。

功能如下

  • 通用统计: 此面板展示了几个主要指标,比如:有效和无效请求的数量,分析这些数据所花费的时间,独立访客的情况,请求的文件,静态文件(CSS, ICO, JPG 等)的完整URL,404错误,被解析的日志文件的大小以及消耗的带宽。
  • 独立访客: 此面板按照日期展示了访问次数,独立访客数,以及累计消耗的带宽等指标。具有相同IP,相同访问时间,相同的 UserAgent 的 HTTP 请求将会被识别为独立访客。默认情况下包含了网络爬虫。

    您也可以选择使用 --date-spec=hr 参数将按照日期分析修改为按照小时,例如:05/Jun/2016:16 。这对于希望在小时级别去跟踪每日流量非常有帮助。
  • 请求的文件: 此面板展示您服务器上被请求次数最多的文件。包含访问次数,独立访客数,百分比,累计消耗带宽,使用的协议,请求方式。

    请求的静态文件: 列出请求频率最高的静态文件类型,例如: JPG, CSS, SWF, JS, GIF, 和 PNG , 以及和上一个面板一样的其他指标。 另外静态文件可以被添加到配置文件中。

    404 或者文件未找到: 展示内容与之前的面板类似,但是其数据包含了所有未找到的页面,以及俗称的 404 状态码。
  • 主机: 此面板展示主机自身的详细信息。能够很好的发现不怀好意的爬虫以及识别出是谁吃掉了你的带宽。

    扩展面板将向您展示更多信息,比如主机的反向DNS解析结果,主机所在国家和城市。如果开启了 参数,选择想查看的 IP 地址并按回车,将会显示 UserAgent 列表。
  • 操作系统: 此面板将显示主机使用的操作系统的信息。GoAccess 将尽可能尝试为每一款操作系统提供详细的信息。
  • 浏览器: 此面板将显示来访主机使用的浏览器信息。GoAccess 将尽可能尝试为每一款浏览器提供详细的信息。
  • 访问次数: 此面板按小时报告。因此将显示24个数据点,每一个均对应每一天的某一个小时。

    使用 --hour-spec=min 参数可以设定为按每十分钟报告,并将以 16:4 的格式显示时间。这对发现服务器的峰值访问时段很有帮助。
  • 虚拟主机: 此面板将显示从访问日志中解析出来的不同的虚拟主机的情况。此面板仅在日志格式中启用了 %v 参数时显示。
  • 来路URL: 如果问题主机通过其他的资源访问了你的站点,以及通过从其他主机上的链接或者跳转到你的站点,则这些来路URL将会被显示在此面板。可以在配置文件中通过 --ignore-panel 开启此功能。(默认关闭)
  • 来路站点: 此面板将仅显示主机的部分,而不是完整的URL。
  • 关键字: 报告支持用在谷歌搜索,谷歌缓存,谷歌翻译上使用关键字。目前仅支持通过 HTTP 使用谷歌搜索。 可以在配置文件中通过 --ignore-panel 开启此功能。(默认关闭)
  • 地理位置: 根据 IP 地址判断地理位置。统计数据按照大洲和国家分组。需要地理位置模块的支持。
  • HTTP 状态码: 以数字表示的 HTTP 请求的状态编码。
  • 远程用户(HTTP验证) 通过 HTTP 验证来确定访问文档的权限。如果文档没有被密码保护起来,这部分将会显示为 “-”。此面板默认为开启,除非在日志格式变量中设置了参数 %e 。

    注意: 如果配置了可选项,所有面板将显示处理请求的平均时间消耗。
存储方式

GoAccess 支持三种类型的存储方式。请根据你的需要和系统环境进行选择。

  • 默认哈希表

    内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小。GoAccess 默认使用内存哈希表。如果你的内存可以装下你的数据集,那么这种模式的表现非常棒。此模式具有非常好的内存利用率和性能表现。
  • Tokyo Cabinet 磁盘 B+ 树

    使用这种模式来处理巨大的数据集,大到不可能在内存中完成任务。当数据提交到磁盘以后,B+树数据库比任何一种哈希数据库都要慢。但是,使用 SSD 可以极大的提高性能。往后您可能需要快速载入保存的数据,那么这种方式就可以被使用。
  • Tokyo Cabinet 内存哈希表

    作为默认哈希表的替换方案。因为使用通用类型在内存表现以及速度方面都很平均。

部署

初始化环境
  1. init_security() {
  2. systemctl stop firewalld
  3. systemctl disable firewalld &>/dev/null
  4. setenforce 0
  5. sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
  6. sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
  7. sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
  8. systemctl enable sshd crond &> /dev/null
  9. echo -e "\033[32m [安全配置] ==> OK \033[0m"
  10. }
  11. init_yumsource() {
  12. if [ ! -d /etc/yum.repos.d/backup ];then
  13. mkdir /etc/yum.repos.d/backup
  14. fi
  15. mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
  16. if ! ping -c2 www.baidu.com &>/dev/null
  17. then
  18. echo "您无法上外网,不能配置yum源"
  19. exit
  20. fi
  21. curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
  22. curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
  23. timedatectl set-timezone Asia/Shanghai
  24. echo "nameserver 114.114.114.114" > /etc/resolv.conf
  25. echo "nameserver 8.8.8.8" >> /etc/resolv.conf
  26. chattr +i /etc/resolv.conf
  27. echo -e "\033[32m [YUM Source] ==> OK \033[0m"
  28. }
部署GoAccess
  1. #安装依赖包
  2. yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel GeoIP-data openssl-devel
  3. wget https://tar.goaccess.io/goaccess-1.3.tar.gz
  4. tar xf goaccess-1.3.tar.gz -C /usr/local/src/
  5. cd goaccess-1.3
  6. ./configure --prefix=/usr/local/goaccess1.3 --enable-utf8 --enable-geoip=legacy --with-openssl
  7. # --enable-debug 使用调试标志编译且关闭编译器优化。
  8. # --enable-utf8 宽字符支持。依赖 Ncursesw 模块。
  9. # --enable-geoip=<legacy|mmdb> 地理位置支持。依赖 MaxMind GeoIP 模块。 legacy 将使用原始 GeoIP 数据库。 mmdb 将使用增强版 GeoIP2 数据库。
  10. # --enable-tcb=<memhash|btree>
  11. # Tokyo Cabinet 存储支持。 memhash 将使用 Tokyo Cabinet 的内存哈希数据库。btree 将使用 Tokyo Cabinet 的磁盘 B+Tree 数据库。
  12. # --disable-zlib 禁止在 B+Tree 数据库上使用 zlib 压缩。
  13. # --disable-bzip 禁止在 B+Tree 数据库上使用 bzip2 压缩。
  14. # --with-getline 使用动态扩展行缓冲区用来解析完整的行请求,否则将使用固定大小(4096)的缓冲区。
  15. # --with-openssl 使 GoAccess 与其 WebSocket 服务器之间的通信能够支持 OpenSSL。
  16. make && make install
  17. ln -s /usr/local/goaccess1.3/ /usr/local/goaccess
  18. echo "export PATH=/usr/local/goaccess/bin:$PATH" >>/etc/profile
  19. source /etc/profile
配置GoAccess
  1. vim /usr/local/goaccess/etc/goaccess/goaccess.conf
  2. time-format %T
  3. date-format %d/%b/%Y
  4. log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
  5. # 配置文件参数说明
  6. # -time-format
  7. # 参数 time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 man strftime。 %T 或者 %H:%M:%S.
  8. # -date-format
  9. # 参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 man strftime。
  10. # -log-format
  11. # 参数 log-format 后跟随一个空格符或者制表分隔符(\t),用于指定日志字符串格式
  12. %x 匹配 time-format date-format 变量的日期和时间字段。用于使用时间戳来代替日期和时间两个独立变量的场景。
  13. %t 匹配 time-format 变量的时间字段。
  14. %d 匹配 date-format 变量的日期字段。
  15. %v 根据 canonical 名称设定的服务器名称(服务区或者虚拟主机)。
  16. %e 请求文档时由 HTTP 验证决定的用户 ID
  17. %h 主机(客户端IP地址,IPv4 或者 IPv6)。
  18. %r 客户端请求的行数。这些请求使用分隔符(单引号,双引号)引用的部分可以被解析。否则,需要使用由特殊格式说明符(例如:%m, %U, %q %H)组合格式去解析独立的字段。
  19. 注意: 既可以使用 %r 获取完整的请求,也可以使用 %m, %U, %q and %H 去组合你的请求,但是不能同时使用。
  20. %m 请求的方法。
  21. %U 请求的 URL
  22. 注意: 如果查询字符串在 %U中,则无需使用 %q。但是,如果 URL 路径中没有包含任何查询字符串,则你可以使用 %q 查询字符串将附加在请求后面。
  23. %q 查询字符串。
  24. %H 请求协议。
  25. %s 服务器回传客户端的状态码。
  26. %b 回传客户端的对象的大小。
  27. %R HTTP 请求的 "Referer" 值。
  28. %u HTTP 请求的 "UserAgent" 值。
  29. %D 处理请求的时间消耗,使用微秒计算。
  30. %T 处理请求的时间消耗,使用带秒和毫秒计算。
  31. %L 处理请求的时间消耗,使用十进制数表示的毫秒计算。
  32. %^ 忽略此字段。
  33. %~ 继续解析日志字符串直到找到一个非空字符(!isspace)。
  34. ~h X-Forwarded-For (XFF) 字段中的主机(客户端 IP 地址,IPv4 或者 IPv6)。
部署Nginx
  1. cat /etc/yum.repos.d/nginx.repo
  2. [nginx-stable]
  3. name=nginx stable repo
  4. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  5. gpgcheck=1
  6. enabled=1
  7. gpgkey=https://nginx.org/keys/nginx_signing.key
  8. module_hotfixes=true
  9. yum -y instal nginx
  10. # 配置Nginx日志格式
  11. vim /etc/nginx/nginx.conf
  12. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  13. '$status $body_bytes_sent "$http_referer" '
  14. '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time';
  15. systemctl start nginx

使用

GoAccess常用参数
  1. goaccess有控制台模式和html静态页面模式,这里先介绍一下控制台模式
  2. goaccess -a -d -f logs/access_web.log -p /usr/local/goaccess/etc/goaccess/goaccess.conf
  3. #常用参数
  4. --addr=
  5. # 将服务器绑定到指定 IP 地址。默认绑定到 0.0.0.0 。
  6. 通常无需指定,除非您希望将服务器绑定到主机上的其他地址。
  7. --daemonize
  8. # 使 GoAccess 作为守护程序运行(仅在 --real-time-html 开启下有效)。
  9. --origin=
  10. # E在 WebSocket 握手中确保客户端发送指定的源头。且指定的源应与浏览器发送源头字段完全相同。例如:--origin=http://goaccess.io
  11. --port=
  12. # 指定服务使用的端口。GoAccess 默认使用端口 7890 作为 WebSocket 服务器。请确保此端口可用。
  13. --real-time-html
  14. # 使能实时 HTML 报告。
  15. --ws-url=<[scheme://]url[:port]>
  16. # 此 URL 用于 WebSocket 服务器的回应。用于客户端侧的 WebSocket 构建器。
  17. # 同时可以选择指定 WebSocket 的 URI 协议,比如:ws:// 用于非加密连接, 以及 wss:// 用于加密连接。示例:wss://goaccess.io
  18. # 如果 GoAccess 运行在代理服务器的后面,您需要通过在主机名后跟随冒号加端口号的方式让客户端连接到另外一个不同的端口。示例:goaccess.io:9999
  19. # 默认情况下,会尝试去连接生成报告的主机名。如果 GoAccess 运行在一台远程服务器上,则远程主机名也应该在 URL 中指定。当然,必须保证主机是有效的。
  20. --fifo-in=<path/file>
  21. # 创建一个管道(先入先出)从指定的路径/文件读取数据。
  22. --fifo-out=<path/file>
  23. # 创建一个管道(先入先出)往指定的路径/文件写入数据。
  24. --ssl-cert=<path/cert.crt>
  25. # 指定 TLS/SSL 证书的路径。使 GoAccess 支持 TLS/SSL,需要使用参数 --ssl-cert 和 --ssl-key。
  26. # 仅在使用了参数 --with-openssl 时有效
  27. --ssl-key=<path/priv.key>
  28. # 指定 TLS/SSL 私钥的路径。使 GoAccess 支持 TLS/SSL,需要使用参数 --ssl-cert 和 --ssl-key。
  29. # 仅在使用了参数 --with-openssl 时有效
  30. 1.24 FILE OPTIONS
  31. -f --log-file=
  32. # 指定输入日志文件的路径。如果在配置文件中指定了输入文件,则其优先级要高于在命令行中通过 -f 参数指定。
  33. -l --log-debug=
  34. # 发送所有调试信息到指定文件。需要指定配置选项 --enable-debug
  35. -p --config-file=
  36. # 指定使用自定义配置文件。如果设置了此参数,其优先级将高于全局配置文件(如果有)。
  37. --invalid-requests=
  38. # 记录无效请求到指定文件。
  39. --no-global-config
  40. # 禁止加载全局配置文件。可能的目录应该是 /usr/etc/, /etc/ 或者 /usr/local/etc/, 除非在运行 ./configure 时指定了 --sysconfdir=/dir 。
  41. -a --agent-list
  42. # 开启 UserAgent 列表。开启后会降低解析速度。
  43. -d --with-output-resolver
  44. # 输出 HTML 或者 JSON 报告时开启 IP 解析。
  45. -e --exclude-ip <IP|IP-range>
  46. # 排除一个 IPv4 或者 IPv6 地址。 使用连接符表示 IP 段(开始-结束)。
  47. exclude-ip 127.0.0.1
  48. exclude-ip 192.168.0.1-192.168.0.100
  49. exclude-ip ::1
  50. exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808
  51. -H --http-protocol=<yes|no>
  52. HTTP 请求协议开关。将创建一个请求字段包含请求协议+真实请求。
  53. -M --http-method=<yes|no>
  54. # HTTP 请求方法开关。将创建一个请求字段包含请求方法+真实请求。
  55. -o --output=<json|csv>
  56. # 将给定文件重定向到标准输出,通过后缀名决定输出格式:
  57. /path/file.csv - Comma-separated values (CSV)
  58. /path/file.json - JSON (JavaScript Object Notation)
  59. /path/file.html - HTML
  60. -q --no-query-string
  61. # 忽略请求的查询字符串。即: www.google.com/page.htm?query => www.google.com/page.htm
  62. # 注意: 去掉查询字符串将极大降低内存消耗,特别对带时间戳的请求。
  63. -r --no-term-resolver
  64. # 在终端输出时禁止 IP 解析。
  65. --444-as-404
  66. # 将非标准状态 444 作为 404 处理。
  67. --4xx-to-unique-count
  68. # 将 4xx 客户端错误数加到独立访客数中。
  69. --all-static-files
  70. # 统计包含查询字符串的静态文件。
  71. --date-spec=<date|hr>
  72. # 设置日期的显示格式,一种是标准日期格式(默认),一种是日期后附加小时的格式。
  73. # 仅在访客面板有效。对于在小时级别分析访客数据很有帮助。显示格式示例:18/Dec/2010:19
  74. --double-decode
  75. # 解码双重编码的值。包括 UserAgent,Request 以及 Referer。
  76. --enable-panel=
  77. # 开启指定面板。面板列表
  78. 控制台操作方法
  79. F1 主帮助页面
  80. F5 重绘主窗口
  81. q 退出
  82. 1-15 跳转到对应编号的模块位置
  83. o 打开当前模块的详细视图
  84. j 当前模块向下滚动
  85. k 当前模块向上滚动
  86. s 对模块排序
  87. / 在所有模块中搜索匹配
  88. n 查找下一个出现的位置
  89. g 移动到第一个模块顶部
  90. G 移动到最后一个模块底部
配置nginx域名访问goaccess
  1. # 导入访问日志
  2. goaccess -f /var/log/nginx/access.log --log-format=COMBINED -a -o /usr/local/nginx/html/index.html
  3. vim /usr/local/nginx/conf/goaccess.conf
  4. server {
  5. listen 7890;
  6. server_name 39.108.140.0;
  7. location / {
  8. root /usr/local/nginx/html;
  9. try_files $uri $uri/ /index.html;
  10. }
  11. proxy_set_header Host $http_host;
  12. proxy_set_header X-Forwarded-Proto $scheme;
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_http_version 1.1;
  15. proxy_set_header Upgrade $http_upgrade;
  16. proxy_set_header Connection "upgrade";
  17. }
  18. # 访问IP:7890,稍等片刻就会出现下面图形

不同的输出
  1. # 输出到终端且生成一个可交互的报告:
  2. # goaccess access.log
  3. # 生成一份 HTML 报告:
  4. # goaccess access.log -a -o report.html
  5. # 生成一份 JSON 报告:
  6. # goaccess access.log -a -d -o report.json
  7. # 生成一份 CSV 文件:
  8. # goaccess access.log --no-csv-summary -o report.csv
  9. # GoAccess 非常灵活,支持实时解析和过滤。例如:需要通过监控实时日志来快速诊断问题:
  10. # tail -f access.log | goaccess -
  11. # 更厉害的是,还可以使用 tail -f 和一个模式匹配工具一起工作,比如: grep, awk, sed 等等
  12. # tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -
  13. # 又或者可以在管道打开的状态下从头开始解析文件,并同时应用一个过滤器:
  14. # tail -f -n +0 access.log | grep --line-buffered 'Firefox' | goaccess -o out.html --real-time-html -
实时HTML输出

GoAccess 有能力在 HTML 报告中展示实时数据。您甚至可以通过电子邮件发送 HTML 报告,因为它是由没有外部文件依赖的单个文件组成,是不是很酷!

  1. # 生成实时 HTML 报告的过程和生成静态报告的过程非常相似。实时报告仅仅需要使用参数 --real-time-html 。
  2. # goaccess access.log -o /usr/share/nginx/html/site/report.html --real-time-html
  3. # GoAccess 默认使用生成报告的主机名。您也可以指定 URL 用于客户端浏览器访问。参考 FAQ 上更详细的示例。
  4. # goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io
  5. # GoAccess 默认侦听端口 7890,如下使用其他端口可以这样操作(确保端口已经打开):
  6. # goaccess access.log -o report.html --real-time-html --port=9870
  7. # 绑定 WebSocket 服务器到不同于 0.0.0.0 的另外一个地址,可以这样操作:
  8. # goaccess access.log -o report.html --real-time-html --addr=127.0.0.1
  9. # 注意: 如果需要在加密连接上输出实时数据,则需要使用 --ssl-cert=<cert.crt> 和 --ssl-key=<priv.key>。

GoAccess分析Web日志的更多相关文章

  1. web后门排查与高效分析web日志技巧

    今年一直大大小小的事情忙,很少有时间能静下心写个文章,所以最近博客更新也越来越少了,公司现在安全团队在我这边,一直在玩命的招人.下个月8号有一个互联网金融的会,4月在qcon北京站,都以嘉宾的身份去分 ...

  2. GoAccess分析Nginx日志详解

    一.为了提高 GoAccess 分析准确度,建议配置 nginx.conf 的 log_format 项如下: log_format main '$remote_addr - $remote_user ...

  3. 23、GoAccess分析Nginx日志

    1.GoAccess基本概述 GoAccess是一个基于终端的快速日志分析器.其核心思想是实时快速分析和查看Web服务器统计信息. 1.安装简单: 2.操作容易: 3.界面酷炫:  2.GoAcce ...

  4. GoAccess 分析 Nginx 日志

    0x00 事件 帮助朋友搭建了博客,运行过了一段时间,准备发个网站分析报告给他. 有效的数据只有 Nginx 的访问日志,于是使用决定 GoAccess 工具对这个日志进行分析, 0x01 安装 吾使 ...

  5. 用GOACCESS分析NGINX日志

    参考URL: http://4b3r.com/goaccess-analyze-nginx-access-log/64/ http://jesuspan.sinaapp.com/crontab%E6% ...

  6. 可视化实时Web日志分析工具-goaccess

    说到web服务器就不得不说Nginx,目前已成为企业建站的首选.但由于种种历史原因,Nginx日志分析工具相较于传统的apache.lighthttp等还是少很多. 今天就和大家分享一个非常强大的实时 ...

  7. [spark案例学习] WEB日志分析

    数据准备 数据下载:美国宇航局肯尼迪航天中心WEB日志 我们先来看看数据:首先将日志加载到RDD,并显示出前20行(默认). import sys import os log_file_path =' ...

  8. Hadoop:实战Web日志分析

    示例场景 日志说明 有两台Web服务器,日志文件存放在/usr/local/nginx/logs/目录,日志默认为nginx定义格式.如: 123.13.17.13 - - [25/Aug/2016: ...

  9. 海量WEB日志分析

    Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...

随机推荐

  1. .NET Core HttpClient源码探究

    前言     在之前的文章我们介绍过HttpClient相关的服务发现,确实HttpClient是目前.NET Core进行Http网络编程的的主要手段.在之前的介绍中也看到了,我们使用了一个很重要的 ...

  2. Java——参数传递

    写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用).这里引用知乎上大神的讲解来记录一下. 一.基本类型和引用类型 int num = 10; String str = &quo ...

  3. 选择器&隔行换色

    选择器的使用理解为:执行jQuery核心函数,传入选择器的字符串    $( ... ) 基本选择器 <!DOCTYPE html> <html> <head> & ...

  4. 树莓派 Ubuntu Mate更换中国软件源

    更换步骤: 1.以root身份打开 /etc/apt/sources.list ,可以用vim或者nano 2.将 http://ports.ubuntu.com/ 全部替换为 http://mirr ...

  5. jQuery-键值对理解

    1.form表单 <form action='url' method='get/post'> <input type='text'/> <input type='pass ...

  6. 【Flume】知识总结

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...

  7. Java实现 LeetCode 762 二进制表示中质数个计算置位(位运算+JDK的方法)

    762. 二进制表示中质数个计算置位 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 ...

  8. Java实现 LeetCode 451 根据字符出现频率排序

    451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e ...

  9. Java实现 蓝桥杯VIP 算法提高 邮票面值设计

    算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...

  10. C++实现车轮轨迹

    标题:车轮轴迹 栋栋每天骑自行车回家需要经过一条狭长的林荫道.道路由于年久失修,变得非常不平整.虽然栋栋每次都很颠簸,但他仍把骑车经过林荫道当成一种乐趣. 由于颠簸,栋栋骑车回家的路径是一条上下起伏的 ...