行程长度编码

前言

NWAFU 2023阶段二 A


一、题目描述

题目描述

“行程长度编码(Run-Length Encoding,RLE)”是一种无损压缩编码方法,其核心思想是依次记录符号序列中的每个字符(忽略大小写)及其重复出现的次数。例如用户输入字符序列(字符串)AaABBBbCBB,则其RLE编码的结果为3A4B1C2B。
下面的代码实现对输入字符串的RLE编码,现要求在函数int rle(char *code, const char *seq);及函数readSeq(char *seq, int n);定义中的五个空白处填充适当的表达式,完成程序功能。
其中:rle()函数形参seq为长度在(0, 80]间(strlen(seq)>0&&strlen(seq)≤80)的全部由大小写英文字母组成的字符串指针,形参code为RLE编码后的结果字符串指针。编码正常结束函数返回0;如字符串指针seq为空或字符串长度不合法时,不进行编码函数直接返回-1;当字符串seq中出现非英文字母的其他字符时,也不进行编码函数直接返回-2。
readSeq()从键盘读取最多n个字符到seq字符串中,以回车符或EOF字符为结束标志。
请使用wget从http://202.117.179.201/attach/P1551.c获取需要填空的代码。完成设计rle()、readSeq()等函数,并在本地完成测试后,仅提交rle()、readSeq()函数及其调用的自定义函数的实现代码

#include <stdio.h>
#include <string.h>#define MAX_SEQ_LEN 80int rle(char *code, const char *seq);
int readSeq(char *seq, int n);int main()
{char seq[MAX_SEQ_LEN + 1] = { 0 };char code[2 * MAX_SEQ_LEN + 1];int r;readSeq(seq, MAX_SEQ_LEN);r = rle(code, seq);switch (r) {case 0:printf("%s\n", code);break;case -1:printf("Length is inValid.\n");break;case -2:printf("Has inValid character.\n");break;}return 0;
}
/* 以上代码禁止提交 */
int readSeq(char *seq, int n)
{int ch, k;k = 0;while ((ch = getchar())) {if (__________(1)_________)break;seq[k++] = ch;}_____(2)______;return k;
}int rle(char *code, const char *seq)
{int i, len = 0;char *p;if (__________(3)____________)return -1;p = (char *)seq;len = 0;while (____(4)____) {char token = *p;i = 1;token &= 0xDF;if (token > 'Z' || token < 'A')return -2;while (_________(5)__________) {i++;}len = sprintf(code, "%d%c", i, token);code += len;}*code = '\0';return 0;
}
样例输入
KAAAEE
样例输出
1K3A2E

二、设计步骤

分析程序结构,通过readSeq函数读入seq字符串,在rle函数中对字符串编码并将结果输出到code中。

readSeq函数与我们日常使用的s_gets()和Readline()完全相同,考查读入条件和在结尾添加空字符,在此不再赘述。

rle函数为该程序核心块。我们在解决问题“删除子串”时为了避免破坏原串,对原串进行了一次拷贝,然后在其拷贝上进行操作。而这个函数在对字符串进行操作时用了一个巧妙的方法:它定义了一个指针常量p(注:指针常量不能修改地址指向的,但可以修改指针指向的地址)并将seq的首地址赋给p,通过再循环内对p自增实现遍历操作,有效保证了程序稳定并避免了内存的浪费。

因此如何对p进行合理的自增操作便成为了一个难点。p在每个外层while循环里的的自增长度取决于 i,而 i 的初始化是在循环内完成的,显然不能在(4)中进行此操作。因此我们将p自增语句填在(5)中,同时加上一个判断条件(这里不熟悉 & 0xDF 的同学可以复习一下位运算)。

调试过程中出现的运行错误是忽略了seq为NULL的情况,在这种情形下,我们如果没有在rle函数循环开始前剔除它,那么在把seq的首地址赋给p后,p在第二个while循环中会进行一次自增,此时p就会访问一处未经声明的空间,出现运行错误。

题解:

int readSeq(char *seq, int n)
{int ch, k;k = 0;while ((ch = getchar())){                    if (k == n || ch =='\n' || ch == EOF)   //(1)   break;seq[k++] = ch;}seq[k] = '\0';        //(2)return k;
}int rle(char *code, const char *seq)
{int i, len = 0;const char *p;if (seq == NULL || strlen(seq) == 0 || strlen(seq) > 80)      //(3)return -1;p = seq;len = 0;while (*p)                                        //(4){char token = *p;i = 1;token &= 0xDF;if (token > 'Z' || token < 'A')return -2;while (*++p && (*p & 0xDF) == token)         //(5){i++;}len = sprintf(code, "%d%c", i, token);code += len;}*code = '\0';return 0;
}

欢迎在评论区讨论! 


总结

NWAFU 2023阶段二 A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Makefile编译原理 变量的使用

一.变量和不同的赋值方法 ->makefile中支持程序设计语言中变量的概念 ->makefile中的变量只代表文本数据&#xff08;字符串&#xff09; ->makefile中的变量名规则 - 变量名可以包含字符&#xff0c;数字&#xff0c;下划线。 - 不能包含 ":" "#&…

C++重点简答题

文章目录&#xff08;持续更新&#xff09; C重点简答题&#x1f4e3;一、什么是静态变量&#xff1f;&#x1f4e3;二、谈谈你对顺序文件的认识&#xff1f;&#x1f4e3;三、什么是局部变量&#xff1f;什么是全局变量&#xff1f;二者的区别&#xff1f;&#x1f4e3;四、谈…

你好2024,OpenStreetMap 20 周岁

2004年&#xff0c;OpenStreetMap在英国诞生。2024年&#xff0c;OpenStreetMap 满 20 周岁&#xff0c;其愿景是创建一个免费的、可编辑的世界地图。当时&#xff0c;地图数据的获取往往受到限制或价格昂贵1。 经过20年的发展&#xff0c;该数据集合成为了最为全面的街道级别开…

宿舍维修管理系统:从数据库到前端的全面解析

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

[openGL]在ubuntu20.06上搭建openGL环境

就在刚刚, 我跑上了一个6小时后出结果的测试程序. 离下班还有很久, 于是我打开了接单群 , 发现了很多可以写的openGL项目. 但是!!我的电脑现在是ubuntu呀, 但是不要慌!!!接下来我一步一步教你如何完美搭建一个ubuntu上的openGL环境. 保证一个坑也不会踩! 文章目录 创建项目工作…

《Git学习笔记:IDEA整合Git》

在IDEA中集成Git去使用 通过Git命令可以完成Git相关操作&#xff0c;为了简化操作过程&#xff0c;我们可以在IDEA中配置Git&#xff0c;配置好后就可以在IDEA中通过图形化的方式来操作Git。 在IDEA开发工具中可以集成Git&#xff1a; 集成后在IDEA中可以看到Git相关图标&…

React16源码: React中调度之batchedUpdates的源码实现

batchedUpdates 1 &#xff09;概述 在 requestWork 在中间, 会判断一个 isBatchingUpdates 做一些特定的操作batchedUpdates 是一个批量更新的操作, 什么是批量更新呢&#xff1f;先来看一个例子 2 &#xff09;示例 index.js import React from react import ReactDOM fr…

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…

二级C语言备考6

一、单选 共40题 &#xff08;共计40分&#xff09; 第1题 &#xff08;1.0分&#xff09; 题号:6675 难度:易 第1章 以下选项中叙述正确的是 A:C程序中的语句要经过编译才能转换成二进制机器指令 B:算法需要包含所有三种基本结构 C:有些算法不能用…

Mac M1 Parallels CentOS7.9 Rancher + K8S + Gitlab + Jenkins +Harbor CICD

一、资源清单 机器名称IP地址角色k8srancher高可用部署: https://blog.csdn.net/qq_41594280/article/details/135312148rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.…

华为机试真题实战应用【赛题代码篇】-分苹果(附Java、C++和python代码)

目录 题目描述 解析思路 思路1 思路2 代码实现 Java 代码2

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

flex布局之美,以后就靠它来布局了

写在前面 在很久很久以前&#xff0c;网页布局基本上通过table 元素来实现。通过操作table 中单元格的align 和valign可以实现水平垂直居中等 再后来&#xff0c;由于CSS 不断完善&#xff0c;便演变出了&#xff1a;标准文档流、浮动布局和定位布局 3种布局 来实现水平垂直居…

恒源云GPU服务器使用Linux图形化界面

编程如画&#xff0c;我是panda&#xff01; 干货满满&#xff0c;不要走开~ 前言 前一节分享了如何在GPU云服务器上创建实例并运行YOLOV5项目&#xff0c;但是使用命令行的方式容易劝退很多小白&#xff0c;并且有些环境配置是需要图形化界面的&#xff0c;所以这一节就教大家…

Redis常见命令、数据类型

我们可以通过Redis的中文文档&#xff1a;Redis命令中心&#xff08;Redis commands&#xff09; -- Redis中国用户组&#xff08;CRUG&#xff09;&#xff0c;来学习各种命令。 也可以通过菜鸟教程官网来学习&#xff1a;Redis 键(key) | 菜鸟教程 一、Redis数据结构介绍 Red…

Koa学习笔记

1、npm 初始化 npm init -y生成 package.json 文件,记录项目的依赖2、git 初始化 git init生成 .git 隐藏文件夹,.git 的本地仓库创建 .gitignore 文件,添加不提交文件的名称3、创建 ReadMe.md 文件 记录项目笔记4、搭建项目 安装 Koa 框架npm install koa5、编写最基本的…

对Transformer的理解。

要理解Transformer&#xff0c;需要先理解注意力机制&#xff0c;下面大部分内容来自台大教授李宏毅老师讲课资料。 注意力机制 之前使用的MLP&#xff0c;CNN&#xff0c;RNN模型可以解决一些简单序列问题&#xff0c;但当序列长度太长容易失去效果&#xff0c;原因是看了新…

xtu oj 1169 最大子段和

题目描述 给你一个数列a1,a2,...,an,求m个连续数字组成的子段和最大值。 输入 有多个样例&#xff0c;每个样例的第一行是两个整数n和m&#xff0c;(1≤m≤n;≤100,000)。如果n和m为0表示输入结束&#xff0c;这个样例不需要处理。第二行是n个整数ai&#xff0c;0≤ai≤1000…

精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;14&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇主要介绍分布式场景下常用的并发流量控制方案&#xff0c;包括固定时间窗口、滑动时间窗口、漏桶、令牌桶、分布式消息中间件…