C语言经典面试题——翻转单词顺序VS左旋转字符串

目录

  • 1. 翻转单词顺序
    • 1.1 题目描述
    • 1.2 解法
    • 1.3 完整代码
  • 2. 左旋转字符串
    • 2.1 题目描述
      • 2.1.1 解法一:
      • 2.1.2 解法二:
        • 2.1.2.1 strcpy
        • 2.1.2.2 strcat
        • 2.1.2.3 完整代码
      • 2.1.3 解法三:

1. 翻转单词顺序

1.1 题目描述

  • 输入一个英文句子,翻转句子中的单词顺序,但每个单词的顺序不变,为简单起见,标点符号和普通字母一样处理,例如:
  • 输入字符串“ I am a student ”,则输出“ student. a am I ”

1.2 解法

  • 这道题目流传很广,很多公司都多次拿来作面试题,很多招聘者也多次在各种博客或者书记上看到过通过两次翻转字符串的解法,也是很快就可以跟面试官解释清楚思路:
  • 第一步反转句子中所有的字符。比如翻转“ I am a student ”中所有的字符得到“ .tneduts a ma I ”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序都翻转了
  • 第二步:再翻转每个单词中字符的顺序了,就得到了 “ student. a am I ” ,这正是题目要求输出的。

1.3 完整代码

#include <stdio.h>
#include <string.h>void Reverse(char str[], int start, int end)
{int temp = 0;while (start < end){temp = str[start];str[start] = str[end];str[end] = temp;start++;end--;}
}//逆置字符串int main()
{char str[] = "I am a student.";int len = strlen(str);int start = 0;int end = len-1;Reverse(str, start, end);//逆置整个句子end = 0;for (int i = 0; i < len; i++){if (str[i] != ' ' && str[i] != '\0'){end++;}else{Reverse(str, start, end - 1);end++;start = end;}}//每个单词再逆置一次printf("%s", str);return 0;
}

2. 左旋转字符串

2.1 题目描述

  • 字符串的左旋操作是把字符串前面若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋操作的功能,比如输入字符串“ abcdefg ”和数字2,该函数将返回左旋转2位得到结果“ cdefgab ”。

2.1.1 解法一:

  • 可以先左旋一次,接着再循环k次(左旋次数)

在这里插入图片描述

  • 先将第一个字符临时存储到一个temp中,接着将后面的字符都往前移动一个字符,最后把temp中的字符赋值到末尾,即实现一次的左旋
  • 代码如下:
#include <stdio.h>
#include <string.h>void Roundn(char str[], int n, int k)
{for (int i = 0; i < k; i++){char temp = str[0];int i = 0;for (; i < n - 1; i++){str[i] = str[i + 1];}//后面的字符都往前移一个字符str[i] = temp;}	
}int main()
{char str[100] = "0";int k = 0;scanf("%s %d", str, &k);//输入字符串和左旋次数并用空格隔开int len = strlen(str);k %= len;Roundn(str, len, k);//左旋k次printf("%s", str);return 0;
}
  • 运行结果如下:

在这里插入图片描述

2.1.2 解法二:

  • 在此之前我们先来了解一下两个内置函数
  1. strcpy
  2. strcat
2.1.2.1 strcpy
  • 函数申明如下:
#include <string.h>//头文件char*strcpy(char*dest,const char*src);//将src数组拷贝到dest数组
  • 注意:
  1. strcpy只用于字符串复制,遇到‘\0’时停止,还会复制字符串的结束符’\0’;所以源字符串必须以’\0’结束,也会将源字符串的’\0’拷贝到目标空间
  2. 目标空间需足够大
  • 示例如下:
#include <stdio.h>
int main()
{char str1[] = "abcdef";char str2[] = "higk";strcpy(str1, str2);printf("%s", str1);return 0;
}

在这里插入图片描述

2.1.2.2 strcat
  • strcat 函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串
    函数申明如下:
#include <string.h>//头文件
char * strcat ( char * destination, const char * source );//将source数组拼接到destination数组后面
  • 示例如下:
#include <stdio.h>
int main()
{char str1[20] = "abcdef";char str2[] = "higk";strcat(str1, str2);printf("%s", str1);return 0;
}

在这里插入图片描述

2.1.2.3 完整代码

  • 我们可以定义另外一个数组,如果我们想要左旋2位,如上图
  • 我们可以先把cdefgh拷贝到str2中,然后再把ab拼接到str2中,就得到了左旋2位后的字符串,
  • 最后再把左旋后的字符串再拷贝回str1,即完成了str1的左旋
#include <stdio.h>
#include <string.h>
#define ROW 20void LeftRound(char str1[ROW], char str2[ROW], int k)
{strcpy(str2, str1 + k);strncat(str2, str1, k);strcpy(str1, str2);
}int main()
{char str1[ROW] = "0";char str2[ROW] = "0";int k = 0;scanf("%s %d", str1, &k);int len = strlen(str1);k %= len;LeftRound(str1, str2, k);printf("%s", str1);return 0;
}
  • 运行结果:

在这里插入图片描述

2.1.3 解法三:

  • 最后一种解法可以参考翻转单词顺序
  • 以 abcdefg 为例,我们可以把它分为两部分,由于想把它的前两个字符移到后面,
  • 我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分
  • 我们分别翻转这两部分,于是就得到了 bagfedc 。
  • 接下来我们再翻转整个字符串,得到 cdefgab 刚好就是把原来字符串旋转两位的结果
#include <stdio.h>
#include <string.h>void Reverse(char str[], int start, int end)
{int temp = 0;while (start < end){temp = str[start];str[start] = str[end];str[end] = temp;start++;end--;}
}//逆置字符串int main()
{char str1[20] = "0";int k = 0;scanf("%s %d", str1, &k);int len = strlen(str1);k %= len;Reverse(str1, 0, k - 1);Reverse(str1, k, len - 1);Reverse(str1, 0, len - 1);printf("%s", str1);return 0;
}
  • 运行结果为:

在这里插入图片描述
最后,
恭喜你又遥遥领先了别人!

在这里插入图片描述

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

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

相关文章

Docker安装RocketMQ 笔记

RocketMQ架构上主要分为四部分&#xff1a; Producer&#xff1a;消息发布的角色&#xff0c;支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递&#xff0c;投递的过程支持快速失败并且低延迟。Consumer&#xff1a;消息消费的角色…

【C++】C++入门— 类与对象初步介绍

C入门 1 认识面向对象2 类的引入3 类的定义类的定义方式 4 类的访问限定符及封装访问限定符封装 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识面向对象 C语言是面向过程的&#xff0c;关注…

浅析Redis③:命令处理之数据返回Client(下)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库&#xff0c;其重要性不言而喻&#xff0c;作为普通开发者&#xff0c;我们在日常开发中使用Redis&#xff0c;主要聚焦于Redis的基层数据结构的命令使用&#xff0c;很少会有人对Redis的内部实现机制进行了解&#xff0c…

109.乐理基础-五线谱-五线谱的附点、休止符、连线、延音线

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的拍号、音符与写法-CSDN博客 上一个内容里练习的答案&#xff1a; 附点&#xff1a;写在符头的右方&#xff0c;附点的作用与简谱一样&#xff0c;延长前面音符本身时值的一半&#xff08;附点&#xff09;…

242. Valid Anagram(有效的字母异位词)

问题描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 问题分析 此问题与383. Ransom Note(赎金信)类似&#xff0c;只是字符变为了…

dubbo+sentinel最简集成实例

说明 在集成seata后&#xff0c;下面来集成sentinel进行服务链路追踪管理&#xff5e; 背景 sample-front网关服务已配置好 集成 一、启动sentinel.jar 1、官网下载 选择1:在本地启动 nohup java -Dserver.port8082 -Dcsp.sentinel.dashboard.serverlocalhost:8082 -Dp…

springcloud bus消息总线

简介 Spring Cloud Bus 配合Spring Cloud Config 使用可以实现配置的动态刷新。 Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka。 Spring C…

Transformer实战-系列教程1:Transformer算法解读1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 现在最火的AI内容&#xff0c;chatGPT、视觉大模…

2024年【道路运输企业安全生产管理人员】免费试题及道路运输企业安全生产管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员免费试题参考答案及道路运输企业安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业安全生产管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助道路运…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(下)

目录 沈阳市的空气质量 华夫图 柱状图 总结 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图和柱状图分析各个城市的情况 沈阳市的空气质量 华夫图 import numpy as np import pandas as pd import matplotlib.pyplot as plt …

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用&#xff0c;从而对一个组织的资产或运行造成不利影响&#xff0c;如信息系统被攻击或控制…

华为数通方向HCIP-DataCom H12-821题库(单选题:401-420)

第401题 R1的配置如图所示,此时在R1查看FIB表时,关于目的网段192.168.1.0/24的下跳是以下哪一项? A、10.0.23.3 B、10.0.12.2 C、10.0.23.2 D、10.0.12.1 【答案】A 【答案解析】 该题目考查的是路由的递归查询和 RIB 以及 FIB 的关系。在 RIB 中,静态路由写的是什么,下…