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 20

void 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;
}
  • 运行结果为:

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI专题:2023年AI和标准化网络安全报告

今天分享的是AI系列深度研究报告&#xff1a;《AI专题&#xff1a;2023年AI和标准化网络安全报告》。 &#xff08;报告出品方&#xff1a;enisa&#xff09; 报告共计&#xff1a;37页 文件目的和目标 本文件的总体目标是概述与人工智能(AI)网络安全有关的标准(现有的、正在…

作业2024/2/3

第二章 引用内联重载 一&#xff0e;选择题 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句 C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句…

三路快排解决TopK问题

前言&#xff1a; 我们首先要明白什么是三路快排&#xff0c;什么是topk问题。 三路快排&#xff1a; 思想&#xff1a; 三路快排就是数组分3块&#xff0c;三个指针&#xff0c;先随机取一个基准值key&#xff0c;然后将数组划分为3个部分&#xff1a; 【小于key】【等于…

【八大排序】冒泡排序 | 快速排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 交换排序一、冒泡排序1.1 算法步骤 动图演示1.2 冒泡排序的效率分析1.3 代码实现1.4 …

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

【计算机视觉】目标检测 |滑动窗口算法、YOLO、RCNN系列算法

一、概述 首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习&#xff0c;我们知道&#xff0c;可以通过卷积神经网络对图像进行分类。 如果还想继续深入&#xff0c;会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上…

Maven快速入门——基础篇

本篇对Maven基础进行总结&#xff0c;主要对Maven的定义、作用、Maven坐标、依赖管理、依赖配置、依赖传递特性以及Maven的生命周期进行总结&#xff0c;后面会对springboot以及Maven高级进行总结。 文章目录 目录 一、Maven是什么&#xff1f; 二、Maven的作用&#xff1a; 三…

基于YOLOv8深度学习的水稻叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

openGauss学习笔记-213 openGauss 性能调优-总体调优思路

文章目录 openGauss学习笔记-213 openGauss 性能调优-总体调优思路213.1 调优思路概述213.2 调优流程 openGauss学习笔记-213 openGauss 性能调优-总体调优思路 213.1 调优思路概述 openGauss的总体性能调优思路为性能瓶颈点分析、关键参数调整以及SQL调优。在调优过程中&…

python使用两个栈实现队列

这里主要是使用两个栈来实现一个队列,并实现队列的入队和出队函数。 对于一个单词hello,如果正常情况下按照队列中先进先出的特点,会按照hello的顺序入队,同样也会按照hello的顺序出队。 添加图片注释,不超过 140 字(可选) 因此如果想要利用两个栈来形成队列,就要将后…

基于SpringBoot+Vue的高校在线答疑管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

前端学习笔记 | 响应式网页+Boostrap

一、响应式网页 一套代码适应多端 1、媒体查询media(条件){css} max-width 小于等于max-width生效min-width 【案例】左侧隐藏 因为CSS的层叠性&#xff0c;书写顺序&#xff1a;max-width从大到小&#xff1b;min-width从小到大。 【媒体查询完整写法】 在html中link用于不同…

JSP和JSTL板块:第二节 JSP的指令和动作 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块&#xff1a;第二节 JSP的指令和动作 一、page指令&#xff1a;页面设置&#xff08;1&#xff09;导入包&#xff1a;import属性&#xff08;2&#xff09;设定字符集&#xff1a;pageEncoding属性&#xff08;3&#xff09;设定错误页面&#xff1a;errorPage/i…

Docker上安装配置tomcat

目录 1. 拉取镜像 2. 创建运行镜像 3. 查看是否创建成功 ps&#xff1a;如果出现404错误 tomcat目录结构 1. 拉取镜像 这里使用 tomcat:8.5.40 版本作为安装 docker pull tomcat:8.5.40 2. 创建运行镜像 docker run -d --name tomcat -p 8080:8080 \--privilegedtrue …

day07-CSS高级

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 left right top bottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置 显示模…

题目:有1,2,3,4共四个数字,能组成多少个不相同而且无重复数字的三位数有多少个,都是多少?lua

这是作者的思路&#xff0c; 创建三个表&#xff0c; 第一个数是从四个数遍历&#xff0c; 第二个是数剔除第一个数进行遍历 第三个是剔除第一第二个数遍历 脚本如下 local a{1,2, 3, 4} local b{} local c{} local d{} local function copy(tbl) local ctbl{} for k,v in…

【JS】基于node-media-server搭建流媒体服务器示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍基于node-media-server搭建流媒体服务器示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

【机器学习】常见算法详解第2篇:KNN之kd树介绍(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

Windows Server安装部署FTP服务

文章目录 建立FTP目录通过IIS在Server上安装FTP服务配置FTP站点配置身份验证和授权测试FTP服务FTP软件推荐FTP客户端软件FTP服务器软件适合Ubuntu的FTP软件 推荐阅读 在Windows操作系统中安装和配置FTP服务&#xff0c;主要是基于Internet Information Services (IIS)的FTP服务…

ABAP 笔记--内表结构不一致,无法更新数据库MODIFY和UPDATE

目录 ABAP 笔记内表结构不一致&#xff0c;无法更新数据库MODIFY和UPDATE ABAP 笔记 内表结构不一致&#xff0c;无法更新数据库 MODIFY和UPDATE 如果是使用MODIFY或者UPDATE