当前位置: 首页 > news >正文

单词倒排——c语言解法

题目链接:单词倒排__牛客网 (nowcoder.com)

 以下是题目:

这个题中有三个点, 一个是将非字母的字符转换为空格, 第二是如果有两个连续的空格, 那么就可以将这两个连续的空格变成一个空格。 第三个点就是让单词倒排。

那么我们就可以将这三个点分别封装成三个函数。

还有就是, 三个函数执行顺序的问题。 这里需要想到连续的空格变成一个空格函数应该是放在非字符字符变成空格之后的。 然后单词倒排放在最后可以完成操作。 

接下来实现函数: 

空格转换

首先先实现空格转换的函数。 

//空格转换
void TranSpace(char* pw)//字符指针。
{char* ptr = pw;while (*ptr != '\0'){if (!isalpha(*ptr))//isalpha函数是判定一个字符是否属于字母。{*ptr = ' ';}ptr++;}
}

 这里的形参是传过来的字符串的首地址, 然后函数内容是对整个字符串进行遍历, 只要不是字母, 那么这个字符就会变成空格。 

减少空格

接下来实现空格的减少。

这个实现的方式有点类似于strstr的实现方式(strstr函数实现方式忘记可以重新复习:字符串函数的模拟实现-CSDN博客), 只要指针指向了空格,这个指针不要动, 作为记忆保存点, 然后重新创建一个指针往下遍历, 直到碰到不是空格的字符就停下来。 然后将中间的空格全部被后面的字符覆盖。

实现过程:

代码如下 

//单空格转换
void SingleSpace(char* pw)
{char* prev = pw;char* cur = pw;char* end = pw;while (*end != '\0'){end++;}end--;//让end指针指向字符串的末尾置。while (*cur != '\0')//遍历整个字符串。{if (*cur == ' ') //只要cur指针指向空格就令prev指向现在的位置保存记忆, 然后cur开始往下遍历找空格{prev = cur;while (*cur == ' ') {cur++;}while (cur - 1 > prev)//对空格进行覆盖 {char* tail = cur;while (tail <= end){*(tail - 1) = *tail;tail++;}*end = '\0';end--;cur--;}}prev = cur;cur++;}
}

 单词倒排

单词倒排有一种神奇的方式, 如下图:

 第一步是将各个单词分别进行倒置, 第二步是将整个字符串倒置, 然后单词就倒排了。代码如下:

//置换字符串
void TransWord(char* pw)
{char* head = pw;char* tail = pw;char* back = tail;while (*back != '\0') //每个单词分别倒置。{head = back;tail = back;while (*tail != ' ' && *tail != '\0'){tail++;}back = tail;back++;tail--;while (head < tail){char tmp = *head;*head = *tail;*tail = tmp;head++;tail--;}}head = pw;tail = pw;while (*tail != '\0') {tail++;}tail--;//;令tail指向字符串尾部。while (head < tail) //字符串逆置{char tmp = *tail;*tail = *head;*head = tmp;head++;tail--;}}

相关文章:

  • proteus8.15图文安装教程
  • ShardingJdbc实战-ShardingJdbc配置及读写分离
  • [FT]chatglm2微调
  • 【C++从0到王者】第四十六站:图的深度优先与广度优先
  • STM32USART串口数据包
  • 字典树基础,朴素字符串查找
  • MySQL 用户账号迁移
  • 小白的matlab简单应用
  • 【打工日常】使用docker部署在线PDF工具
  • 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真
  • 《TCP/IP详解 卷一》第9章 广播和组播
  • 【Linux C | 网络编程】套接字选项、getsockopt、setsockopt详解及C语言例子
  • MYSQL高级_目录
  • Windows的Docker-Desktop安装与问题总结
  • 2. 获取帮助(Getting Help)
  • classpath对获取配置文件的影响
  • Consul Config 使用Git做版本控制的实现
  • emacs初体验
  • input实现文字超出省略号功能
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java 最常见的 200+ 面试题:面试必备
  • mysql中InnoDB引擎中页的概念
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • spring学习第二天
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对JS继承的一点思考
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 开发基于以太坊智能合约的DApp
  • 面试遇到的一些题
  • 网络应用优化——时延与带宽
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • # 飞书APP集成平台-数字化落地
  • #pragma once与条件编译
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (一一四)第九章编程练习
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)winform之ListView
  • (转)创业的注意事项
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 的字符串暂存池
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net开发引用程序集提示没有强名称的解决办法
  • :=
  • @Autowired注解的实现原理
  • @SuppressWarnings(unchecked)代码的作用
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AIGC] MySQL存储引擎详解
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]winform部署yolov5-onnx模型