华为机试HJ26 字符串排序

首先看一下题

描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。
 

如,输入: By?e 输出: Be?y

数据范围:输入的字符串长度满足 1≤n≤1000 

输入描述:

输入字符串

输出描述:

输出字符串

示例1

输入:

A Famous Saying: Much Ado About Nothing (2012/8).

输出:

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

一、问题分析

题目的要求是:

1.编写一个程序,将输入字符串中的字符按一定的规则排列

2.规则1:英文字母从A到Z排列,不区分大小写

3.规则2:同一个英文字母的大小写同时存在的时候,按照输入顺序排列

4.规则3:非英文字母的其它字符保持原来的位置

5.数据范围:输入的字符串长度满足:n大于等于1小于等于1000

6.输入描述:输入字符串

7.输出描述:输出字符串

二、解题思路

1.我们需要重新排列一个字符串,按照字母顺序排列,非字母的其它字符的位置固定不变

2.我们需要注意的是,字母的大小写形式同时存在时,在前面的还是在前面,后面的还是在后面

3.我们可以遍历字符串,从A到Z搜索,如果遇到A,就把A和前面的非A的字母顺序调换,直到字符串末尾

4.我们可以定义一个开始的位置startIndex = 0,每次我们交换了一个字母的顺序到前面,或者我们遇到了我们正要搜索的字母或者我们碰到了非字母的字符我们直接startIndex++, 下次我们只需要从startIndex的位置向后遍历就可以了

比如例子里这个字符串

A Famous Saying: Much Ado About Nothing (2012/8).

我们搜索A,发现了A, 我们直接startIndex++;(现在是1)

然后我们继续搜索A,搜索到了第四个位置的a,我们尝试和前面的字符交换,

由于之前startIndex增加了1,变成了1,所以现在在空格的位置,

我们判断出来是一个空格,于是我们startIndex++(现在是2),然后继续往后找

发现了字母F,我们a和F的顺序调换,

于是字符串变成了

A aFmous Saying: Much Ado About Nothing (2012/8).

之后我们startIndex++,(此时的startIndex在3的位置,也就是F的位置)

然后继续往后找,又找到一个a,然后和F的位置交换字符串变成了

A aamous SFying: Much Ado About Nothing (2012/8).

然后startIndex++,这样的逻辑应该可以完成我们的要求

5.还有一点需要注意,我们不希望写26次判断语句,所以我们可以用ASCII码的方式对字母进行判断

if(input[j] == 'a' + i || input[j] == 'A' + i)

3.按照刚才的说法忽略了规则2,正确的做法应该是定义一个新的char newstr[1001];

然后定义一个int index = 0;用来辅助创建newstr

定义一个int len = strlen(str);

对于i=0-26,遍历26个字母

对于str[j],j=0到len遍历字符串,如果遇到了str[j] == 'a' + i || str[j] == 'A' + i的情况(遇到目标字母)

我们检查isalpha(str[index]),如果str[index]是字母,那么我们newstr[index] = str[j]

否则我们newstr[index]=str[index]

然后index++

之后打印newstr就可以了

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <string.h>
#include <ctype.h>int main() {char str[1001];fgets(str, sizeof(str), stdin);int startIndex = 0;int endIndex = strlen(str);// printf("the endindex is %d\n", endIndex);if(endIndex == 0) return 0;for(int i = endIndex; i > 0; i--) {if(isalpha(str[i])) {endIndex = i;break;}}// printf("the endindex is %d\n", endIndex);// printf("the character here is %c\n", str[endIndex]);for(int i = 0; i < 26; i++) {for(int j = startIndex; j <= endIndex; j++) {if(str[j] == 'a' + i || str[j] == 'A' + i) { //如果碰到了要找的字母(需要放到前面的字母)// printf("the i is %d\nthe j is %d\n",i ,j);if(j == startIndex) {// printf("in this situation the current character is our target.\n");startIndex++;}else {// 我们需要去寻找可以和我们的要放到前面的字母交换位置的字母for(int k = startIndex; k <= j; k++) {if(!isalpha(str[k])) {startIndex++;// printf("the startindex is %d now\n", startIndex);} else {char temp = str[k];str[k] = str[j];str[j] = temp;startIndex++;break;}}}}}}// str[strlen(str)] = '\0';printf("%s\n", str);return 0;
}

下面是正确的代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>int main() {char str[1001];fgets(str, sizeof(str), stdin);char newstr[1001];int len = strlen(str);int newstrIndex = 0;int strIndex = 0;for(int i = 0; i < 26; i++) {for(int j = 0; j < len; j++) {while(!isalpha(str[newstrIndex]) && newstrIndex < len) {newstr[newstrIndex] = str[newstrIndex];newstrIndex++;}if(str[j] == 'a' + i || str[j] == 'A' + i) {newstr[newstrIndex] = str[j];newstrIndex++;}}}newstr[newstrIndex] = '\0';printf("%s\n", newstr);return 0;
}

20241031 22:00-2041101 11:31

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

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

相关文章

学习正则表达式,如何校验手机号与电子邮箱

文章目录 一、正则表达式基础知识1.特殊字符&#xff08;Metacharacters&#xff09;2.字符类&#xff08;Character Classes&#xff09;3.预定义字符集&#xff08;Predefined character classes&#xff09;4.分组&#xff08;Groups&#xff09;5.量词&#xff08;Quantifi…

[QUIC] QUIC Frames

PADDING PADDING Frame {Type (i) = 0x00, }这个帧用于增加 QUIC 包的大小。 对于 Initial 包, 可以用它来增加包大小以达到要求的最小包的大小限制。 填充 QUIC 包以对抗流量分析。 这个帧的大小为1字节,表明自己是一个 PADDING 帧。 PING PING Frame {Type (i) = 0x01, …

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…

责任链模式 Chain of Responsibility

1 意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 2 结构 Handler 定义一个处理请求的接口;(可选)实现后继链。 ConcreteHandler …

设计模式小结一工厂模式

先上结论: 工厂模式,也是一个开发者必须要掌握的设计模式。笔者记得大学里编程接触到的第一个设计模式就是工厂模式,现在回过头来看,那时接触的应该叫简单工厂模式,工厂模式还包括:工厂方法模式、抽象工厂模式。 开干! 老规矩,先上理论: 工厂模式(Factory Pattern…

SQL Server 2008 R2 详细安装教程及错误解决教程

SQL Server 2008 R2 详细安装教程及错误解决教程 文章目录 SQL Server 2008 R2 详细安装教程及错误解决教程1.装载或解压ISO文件2. 运行setup程序3. 下载并安装.NET Framework3.54.选择全新安装或向现有安装添加功能5.输入秘钥同意条款6.选择安装类型7.设置角色8.功能选择9.实例…

国际版JAVA同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5

架构分析 导航栏&#xff1a;位于界面上方&#xff0c;包含了“数据中心”、“消息”、“用户中心”等主要功能模块的入口&#xff0c;方便用户快速访问。左侧功能模块&#xff1a;在界面的左侧&#xff0c;以列表形式展示了多个功能模块&#xff0c;如“数据中心”、“消息中…

营销页面设计:精准触达目标群体的艺术

在当今数字化的商业世界中&#xff0c;营销页面设计扮演着至关重要的角色。成功的营销页面设计不仅仅是美观那么简单&#xff0c;它需要结合场景设计、精准定位目标群体、巧妙运用设计元素以及精心策划的色彩搭配&#xff0c;共同编织出一张引人入胜的视觉网络。 今天就以洋河…

【spark面试题】RDD和DataFrame以及DataSet有什么异同

RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff1a; 概念&#xff1a;可理解为分布式的列表。它的每个元素代表数据的一行&#xff0c;具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据&#xff0c;具有很强的灵活性。例如&#…

gdb和make工具

gdb工具&#xff1a; GDB的主要功能 断点设置&#xff1a;允许开发者在特定的代码行设置断点&#xff0c;当程序执行到该行时会自动暂停&#xff0c;方便开发者进行调试和分析。 变量查看与修改&#xff1a;在程序运行过程中&#xff0c;可以查看和修改变量的值&#xff0c;以…

Java实现图片转pdf

该方法可以选择多个图片是否合并为一个pdf输出&#xff0c;也可以选择图片为横向或者纵向输出&#xff0c;也可以选择pdf页面为A3或者A4 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…

web实操3——servlet

课程链接b站&#xff1a;第12课 https://www.bilibili.com/video/BV1qv4y1o79t?spm_id_from333.788.videopod.episodes&vd_source05a3c1275b87b47507d869e9349ee3cd&p233 为什么只要写一个实现Servlet的类就可以被调用 tomcat根据url去web.xml里定位到我们写的类后&…

Jest项目实战(1):JavaScript 库设计原则及最佳实践

JavaScript库设计 在开始项目实战之前&#xff0c;我们先来介绍一下在设计开源库的时候有哪些原则以及最佳实践。 函数的设计 函数包含三要素&#xff1a; 函数名参数返回值 函数名 函数通常表示做一件事情&#xff0c;因此函数名一般为一个动词或者表示动作的短语&#…

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…

hpp文件的使用

提示&#xff1a;文章 文章目录 前言一、背景二、过程2.1 编写代码2.3 问题探究 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近突然看到hpp文件&#xff0c;查了百度也没有hpp文件怎么写的说明&#xff0c;自己就试着写了下&#xff0c;写成功了。 而…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

java: 题目:银行账户管理系统

题目&#xff1a;银行账户管理系统 设计一个简单的银行账户管理系统。要求实现以下功能&#xff1a; 1. 创建一个银行账户 BankAccount 类&#xff0c;该类具有以下属性&#xff1a;accountNumber&#xff08;账户号码&#xff0c;类型为 String&#xff09; balance&#xff…

2024年无线领夹麦克风十大品牌推荐,衣领麦克风哪个品牌好

声音&#xff0c;是沟通的桥梁&#xff0c;是信息的载体。在信息爆炸的时代&#xff0c;如何让自己的声音脱颖而出&#xff0c;成为了每个人都需要思考的问题。无线领夹麦克风&#xff0c;以其小巧便携、无线传输的特点&#xff0c;成为了众多声音爱好者的首选。市场上无线领夹…

【C++的vector、list、stack、queue用法简单介绍】

【知识预告】 vector的介绍及使用list的介绍及使用list与vector的对比stack的介绍和使用queue的介绍和使用priority_queue的介绍和使用 1 vector的介绍及使用 1.1 vector的介绍 vector是表示可变大小数组的序列容器和数组类似&#xff0c;vector也采用连续存储空间来存储元…