HJ31 单词倒排 题解
题目描述:单词倒排_牛客题霸_牛客网 (nowcoder.com)
对字符串中的所有单词进行倒排。
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;

方法一:
定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替换成为字符串结尾标志'\0',则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多个字符串,最终对字符指针数组进行逆序打印每个单词即可。
- 创建一个字符数组来存储输入字符串,并用一个指针指向字符串的开头;创建一个字符指针数组,用于保存每个单词的起始字符地址;
- 创建一个循环,遍历输入字符串中的每个字符;
- 在循环中,检查当前字符是否为字母(大小写字母),你可以使用C标准库中的
isalpha()函数来进行检查:
- 如果是字母,标记单词的起始位置,然后移动指针知道跳过这个单词(但指针指向的不是字母字符时,就跳过了一个单词);
- 如果遇到非字母字符(即不构成单词的字符),将该字符替换成为字符串结尾标志'\0',向后移动指针;
- 下标由大到小地打印字符指针数组的内容。
代码:
#include <stdio.h>
#include <ctype.h>
int main() {char arr[10001] = {0};char* dst[10001] = {NULL};gets(arr);char* move = arr;int count = 0;while(*move != '\0'){// 当遇到字母字符时if(isalpha(*move)){//记录单词的起始地址dst[count++] = move;// 跳过这个单词,找到非字母字符while(*move != '\0' && isalpha(*move)){move++;}continue;}// 当遇到非字母字符时*move = '\0';move++;}// 逆序打印for(int i = count-1;i>=0;i--){printf("%s ", dst[i]);}return 0;
}
注:
在跳过一个单词的循环时,如果只是下面这种形式,可能会造成越界访问。例如:字符串为 “I am a student\0”。
while(isalpha(*move))move++;
在跳过最后一个单词 student 时,指针会指向 ’\0‘,跳出循环进行下一步:*move = ’\0‘ ;move++,即 ’\0‘ = ’\0‘ ;move++。这时move会指向字符串 ’\0‘ 后面一个位置,然后再一次进行外循环判断条件 *move != '\0',对move进行解引用,此时就发生了越界访问。
所以,正确的写法如下:
if(isalpha(*move))
{//记录单词的起始地址dst[count++] = move;// 跳过这个单词,找到非字母字符while(*move != '\0' && isalpha(*move)){move++;}continue;
}
这样,在跳过最后一个单词 student 时,指针指向 ’\0‘,跳出循环,执行continue使下一步:*move = ’\0‘ ;move++,不被执行,然后再一次进行循环判断 *move != '\0','\0' != '\0',条件为假,结束循环。
而且添加 continue 不会影响普通情况,例如:当跳过单词 am 时,move指向空格,执行continue,进行外循环判断条件 *move != '\0' , ’ ‘ != '\0',条件为真,进入循环:判断空格是否为字母字符--不是字母字符执行 *move = '\0'; move++;
方法二:
因为,之前做过 单词逆置 这个题目(整体逆置,再逆置每一个单词),所以我用了这种思路,不过这种方法比较暴力。如果你想要了解 单词逆置 的话,可以看一下http://t.csdn.cn/pwNTt这篇博客。
步骤:
- 整体逆置,再逆置每一个单词,此时的字符串只需要再将单词之间的非字母字符(一个或多个)变成空格即可;
- 创建一个新的字符数组,用一个指针指向逆置后字符串的开头,进行判断:
- 如果指针指向的是字母字符,就将指针指向的内容添加到新的字符数组中;
- 如果指针指向的不是字母字符,就将空格添加到新的字符数组中;
- 最后打印新的字符数组。
因为单词之间只有一个空格,所以并不能 “ 遇到一个非字母字符时,就将空格添加到新的字符数组中” ;我们发现指针指向的非字母字符是字母字符后面一个非字母字符时,才添加空格,所以这里可以用一个变量来作为添加空格的条件:
当指针指向的是字母字符时,flag = 1;
当指针指向的是非字母字符时,判断条件:如果flag等于1时,添加空格,并将flag=0;如果flag不等于1,就不添加。
所以步骤就变成这样:
- 整体逆置,再逆置每一个单词,此时的字符串只需要再将单词之间的非字母字符(一个或多个)变成空格即可;
- 创建一个新的字符数组,用一个指针指向逆置后字符串的开头,进行判断:
- 如果指针指向的是字母字符,就将指针指向的内容添加到新的字符数组中,flag赋值为1;
- 如果指针指向的不是字母字符,如果flag等于1时,就将空格添加到新的字符数组中,如果flag不等于1,就不添加;flag赋值为0;
- 最后打印新的字符数组。
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void reverse(char* left, char* right)
{while (left < right){char temp = *left;*left = *right;*right = temp;left++;right--;}
}
int main() {char arr[10000] = { 0 };gets(arr);int len = strlen(arr);reverse(arr, arr + (len - 1));//逆置整体char answer[30] = { 0 };int flag = 0;char* dst = answer, * move = arr;// 逆置单词char* start = arr;char* end = start;while (*start != '\0')//当*start等于\0时,停止逆序{while (isalpha(*end) && *end != '\0')//注意最后一个单词的后面不是空格{end++;}reverse(start, end - 1);if (*end != '\0')//如果最后一个单词在向后移动时,会导致start跳过\0从而导致死循环end++;start = end;}// 将字符添加到新的字符数组中while (*move != '\0'){if (isalpha(*move)){*dst = *move;dst++;flag = 0;}else{if (flag == 0){*dst = ' ';dst++;flag = 1;}}move++;}*dst = '\0';puts(answer);return 0;
}
今天的分享就到这里了,如果,你感觉这篇博客对你有帮助的话,就点个赞吧!感谢感谢……
相关文章:
HJ31 单词倒排 题解
题目描述:单词倒排_牛客题霸_牛客网 (nowcoder.com) 对字符串中的所有单词进行倒排。 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字符…...
LeetCode42.接雨水
这道题呢可以按列来累加,就是先算第1列的水的高度然后再加上第2列水的高度……一直加到最后就是能加的水的高度,我想到了这里然后就想第i列的水其实就是第i-1列和i1列中最小的高度减去第i列的高度,但是其实并不是,比如示例中的第5…...
优化时间流:区间调度问题的探索与解决
在浩如烟海的信息时代,时间的有效管理成为了一门不可或缺的艺术。无论是生活中的琐事,还是工作中的任务,时间都在无声地流逝,挑战着我们的智慧。正如时间在日常生活中具有的宝贵价值一样,在计算机科学领域,…...
【Python】强化学习:原理与Python实战
搞懂大模型的智能基因,RLHF系统设计关键问答 RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)虽是热门概念,并非包治百病的万用仙丹。本问答探讨RLHF的适用范围、优缺点和可能遇到的问题ÿ…...
设计模式——合成复用原则
文章目录 合成复用原则设计原则核心思想合成案例聚合案例继承案例优缺点 合成复用原则 原则是尽量使用合成/聚合的方式,而不是使用继承 设计原则核心思想 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。…...
基于OpenCV实战(基础知识一)
目录 简介 1.计算机眼中的图像 2.图片的读取、显示与保存 3.视频的读取与显示 简介 OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和…...
如何高效的接入第三方接口
作为程序员的我们,经常会接到领导的安排,接入某某的接口,方面我们如何如何, 例如:领导在1号时给作为员工的你说,最近系统需要增加一个新的支付方式,一会和对方技术组建一个群,有什么问题,可以直接在群里说,最近还说,尽快接入,客户等着用,让你在5号前,完成接入工…...
docker pip下载依赖超时或失败问题解决
Docker容器使用pip安装Python库时超时,可能是由于多种原因。以下是一些建议和解决方法: 使用国内镜像源: 如果你位于中国,可以尝试更换到国内的镜像源。例如,可以使用阿里云、腾讯云、清华大学提供的镜像。 你可以在Dockerfile中添…...
python并发编程
一、程序提速的方法 二、python对并发编程的支持 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成;多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务&am…...
【面试题】:前端怎么实现权限设计及遇到的bug
一.权限的概念 前端权限分为页面权限、按钮权限、API权限。 二.页面权限的实现过程 ①用户登录进去调用获取用户信息接口,后端会给我们返回一个权限标识符 ②在获取到数据之后,我们就要判断用户能访问到哪些页面,我们可以在vuex中permission模块中的action…...
Vue 2 插槽
可以先阅读组件基础-简单了解通过插槽分发内容。 一、插槽定义 插槽将子组件标签间的内容分发到子组件模板的<slot>标签位置。 如果没有<slot>标签,那么该内容将被丢弃。 二、编译作用域 内容在哪个作用域编译,就可以访问哪个作用域的数据…...
Spring 容器启动耗时统计
为了了解 Spring 为什么会启动那么久,于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…...
1. 优化算法学习
参考文献 1609:An overview of gradient descent optimization algorithms 从 SGD 到 Adam —— 深度学习优化算法概览(一) - 知乎 机器学习札记 - 知乎...
再获荣誉丨通付盾WAAP解决方案获“金鼎奖”优秀金融科技解决方案
今年四月,2023中国国际金融展在首钢会展中心成功落下帷幕。中国国际金融展作为金融开放创新成果的展示、交流、传播平台,历经多年发展,已成为展示中国金融发展成就、宣传金融改革成果、促进金融产业创新和推动金融信息化发展的有效平台。 “金鼎奖”评选…...
【腾讯云 TDSQL-C Serverless 产品测评】“橡皮筋“一样的数据库『MySQL高压篇』
【腾讯云 TDSQL-C Serverless 产品测评】"橡皮筋"一样的数据库 活动介绍服务一览何为TDSQL ?Serverless 似曾相识? 降本增效,不再口号?动手环节 --- "压力"山大实验前瞻稍作简介资源扩缩范围(CCU&…...
python http文件上传
server端代码 import os import cgi from http.server import SimpleHTTPRequestHandler, HTTPServer# 服务器地址和端口 host = 0.0.0.0 port = 8080# 处理文件上传的请求 class FileUploadHandler(SimpleHTTPRequestHandler):def do_POST(self):# 解析多部分表单数据form = …...
Android学习之路(9) Intent
Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…...
vue项目配置git提交规范
vue项目配置git提交规范 一、背景介绍二、husky、lint-staged、commitlint/cli1.husky2.lint-staged3.commitlint/cli 三、具体使用1.安装依赖2.运行初始化脚本3.在package.json中配置lint-staged4.根目录新增 commitlint.config.js 4.提交测试1.提示信息格式错误时2.eslint校验…...
影响交叉导轨运行速度的因素有哪些?
交叉导轨具有精度高,速度快,承载能力大、结构简单等特点,被广泛应用在固晶机、点胶设备、自动化设备、OA机器及其周边机器、测定器、印刷基板开孔机,精密机器,光学测试仪、光学工作台、操纵机构、X 射缐装置等的滑座部…...
List转Map
一、list转map Map<Long, User> maps userList.stream().collect(Collectors.toMap(User::getId,Function.identity())); 看来还是使用JDK 1.8方便一些。 二、另外,转换成map的时候,可能出现key一样的情况,如果不指定一个覆盖规则&…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
