C语言刷题(7)(字符串旋转问题)——“C”

简介: C语言刷题(7)(字符串旋转问题)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是复习之前的知识点,那么,就是做一道小小的题目啦,下面,让我们进入C语言的世界吧


实现一个函数,可以左旋字符串中的k个字符。


例如:


ABCD左旋一个字符得到BCDA


ABCD左旋两个字符得到CDAB


首先,给定一个字符串

e26aabaf7b4845e7b9d7486ac5c36084.png

如果是左旋一个字符,那么可以这样来做:把a拿出来,放在自己定义的一个变量中,再把b移到原来a的位置,以此类推,把c移到原先b的位置,把d移到原先c的位置,把e移到原先d的位置,把f移到原先e的位置,最后,把a放到原先f的位置,这样,就成功左旋一个字符啦

95db53ddac4247c99101a2e4cf54b264.png

474d3e494c0f400eb5a32a7874488f14.png

好啦,基本思路就是这个样子,然后,我们来写代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void left_move(char arr[], int k)
{
  int i = 0;
  int len = strlen(arr);
  k = k % len;
  for (i = 0; i < k; i++)
  {
    //左旋一个字符
    //1
    char tmp = arr[0];
    //2
    int j = 0;
    for (j = 0; j < len - 1; j++)
    {
      arr[j] = arr[j + 1];
    }
    //3
    arr[len - 1] = tmp;
  }
}
int main()
{
  char arr[20] = "abcdef";
  int k = 0;
  scanf("%d", &k);
  left_move(arr, k);
  printf("%s\n", arr);
  return 0;
}

6fd55abceabe40f4a2759c62d7b92bf3.png

另一种方法——三步翻转法

24dff112c1ca4bb791600d2a4a22f4a2.png

然后,肯定需要用到字符串逆序的函数,字符串逆序,就是:把b和c交换顺序,a和d交换顺序,f和e交换顺序

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
  assert(left != NULL);
  assert(right != NULL);
  while (left < right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
void left_move(char arr[], int k)
{
  int len = strlen(arr);
  k = k % len;
  reverse(arr, arr + k - 1);//左
  reverse(arr + k, arr + len - 1);//右
  reverse(arr, arr + len - 1);//整体
}
int main()
{
  char arr[20] = "abcdef";
  int k = 0;
  scanf("%d", &k);
  left_move(arr, k);
  printf("%s\n", arr);
  return 0;
}

87e9728a005d4b57b2bd58df5ff37202.png

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。


例如:


给定s1 =AABCD和s2 = BCDAA,返回1


给定s1=abcd和s2=ACBD,返回0.


AABCD左旋一个字符得到ABCDA


AABCD左旋两个字符得到BCDAA


AABCD右旋一个字符得到DAABC


和上面的题目非常相似

#include<stdio.h>
#include<string.h>
int is_left_move(char arr1[], char arr2[])
{
  int i = 0;
  int len = strlen(arr1);
  for (i = 0; i < len; i++)
  {
    //左旋一个字符
    //1
    char tmp = arr1[0];
    //2
    int j = 0;
    for (j = 0; j < len - 1; j++)
    {
      arr1[j] = arr1[j + 1];
    }
    //3
    arr1[len - 1] = tmp;
    if (strcmp(arr1, arr2) == 0)
    {
      return 1;
    }
  }
  return 0;
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "cdefab";
  int ret = is_left_move(arr1, arr2);
  if (ret == 1)
  {
    printf("yes\n");
  }
  else
  {
    printf("no\n");
  }
  return 0;
}

f3a86ad6852f43ffb0d929f63efb17c8.png

#include<stdio.h>
#include<string.h>
int is_left_move(char arr1[], char arr2[])
{
  int len1 = strlen(arr1);
  int len2 = strlen(arr2);
  if (len1 != len2)
  {
    return 0;
  }
  strncat(arr1, arr2, len1);
  if (strstr(arr1, arr2))
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "cdefab";
  int ret = is_left_move(arr1, arr2);
  if (ret == 1)
  {
    printf("yes\n");
  }
  else
  {
    printf("no\n");
  }
  return 0;
}

这个代码中运行了很多字符串函数,正好小雅兰之前写过这样的知识点:

字符函数和字符串函数(上)——“C”_认真学习的小雅兰.的博客-CSDN博客

字符函数和字符串函数(下)——“C”_认真学习的小雅兰.的博客-CSDN博客

88075ac1524f4a9d9ed0d3dc6d579d42.png

好啦,小雅兰今天的内容就到这里啦,继续加油!!!

469cc8efd437475388562624d2885453.jpg


相关文章
|
2月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
92 10
|
3月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
182 4
|
4月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
5月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
147 8
|
4月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
30 0
|
5月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
310 7
|
5月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
201 4
|
5月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
6月前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
46 4
|
6月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
75 0