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 
#include 

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次(左旋次数)

C语言经典面试题——翻转单词顺序VS左旋转字符串_第1张图片

  • 先将第一个字符临时存储到一个temp中,接着将后面的字符都往前移动一个字符,最后把temp中的字符赋值到末尾,即实现一次的左旋
  • 代码如下:
#include 
#include 

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;
}

  • 运行结果如下:

C语言经典面试题——翻转单词顺序VS左旋转字符串_第2张图片

2.1.2 解法二:

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

	return 0;
}

C语言经典面试题——翻转单词顺序VS左旋转字符串_第3张图片

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

	return 0;
}

C语言经典面试题——翻转单词顺序VS左旋转字符串_第4张图片

2.1.2.3 完整代码

C语言经典面试题——翻转单词顺序VS左旋转字符串_第5张图片

  • 我们可以定义另外一个数组,如果我们想要左旋2位,如上图
  • 我们可以先把cdefgh拷贝到str2中,然后再把ab拼接到str2中,就得到了左旋2位后的字符串,
  • 最后再把左旋后的字符串再拷贝回str1,即完成了str1的左旋
#include 
#include 
#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;
}
  • 运行结果:

C语言经典面试题——翻转单词顺序VS左旋转字符串_第6张图片

2.1.3 解法三:

  • 最后一种解法可以参考翻转单词顺序
  • 以 abcdefg 为例,我们可以把它分为两部分,由于想把它的前两个字符移到后面,
  • 我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分
  • 我们分别翻转这两部分,于是就得到了 bagfedc 。
  • 接下来我们再翻转整个字符串,得到 cdefgab 刚好就是把原来字符串旋转两位的结果
#include 
#include 

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

C语言经典面试题——翻转单词顺序VS左旋转字符串_第7张图片
最后,
恭喜你又遥遥领先了别人!

C语言经典面试题——翻转单词顺序VS左旋转字符串_第8张图片

你可能感兴趣的:(C语言经典练习,c语言,面试,开发语言)