【牛客刷题】/*C语言实现字符串左旋*/

简介: 【牛客刷题】/*C语言实现字符串左旋*/

嗨,陌生人,你好。欢迎来到令辰柒的博客主页!✨

🍛博主简介:一名大二即将升大三的科班学生,正在努力学习编程!

🍮系列专栏:【牛客刷题记录站】。(欢迎订阅)☕

🍎正文开始:

   🍊问题要求:

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

   🚢例如:

   ABCD左旋一个字符得到BCDA

   ABCD左旋两个字符得到CDAB

🍵🍵问题分析:从给出的条件可以看出,我们需要给定我们的旋转次数,然后依次把字符串前面的元素经过旋转放到字符串后面去。

方法1

🍇直接了当法:

   🍈第一种方法的思想就是我们把第一个字符用tmp单独存放起来,然后将整个字符串整体向前移动一位,最后我们把tmp里面存放的字符放到后面。

   void leftRound(char * src, int time)

   {

    int i, j, tmp;

     int len = strlen(src);

     time %= len; //长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。

    for (i = 0; i < time; i++) //执行k次的单次平移

    {

     tmp = src[0];

     for(j = 0; j < len - 1; j++) //单次平移

     {

      src[j] = src[j + 1];

     }

     src[j] = tmp;

    }

   }

方法2

⛵拼接法:

   void leftRound(char * src, int time)

   {

    int len = strlen(src);

    int pos = time % len; //断开位置的下标

    char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp

   

    strcpy(tmp, src + pos); //先将后面的全部拷过来

    strncat(tmp, src, pos); //然后将前面几个接上

    strcpy(src, tmp); //最后拷回去

   }

方法3

🛸逆序法:

   🛥️🛥️先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:

   void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序

   {

    int i, j;

    char tmp;

   

    for (i = start, j = end; i < j; i++, j--)

    {

     tmp = str[i];

     str[i] = str[j];

     str[j] = tmp;

    }

   }

   

   void leftRound(char * src, int time)

   {

    int len = strlen(src);

    int pos = time % len;

    reverse_part(src, 0, pos - 1); //逆序前段

    reverse_part(src, pos, len - 1); //逆序后段

    reverse_part(src, 0, len - 1); //整体逆序

   }

🚈运行结果:

bb3364fcef674ca2b3c44c2a8b02d4e2.png🛩️VS下完整代码:

   #define _CRT_SECURE_NO_WARNINGS

   #include<stdio.h>

   void reverse_part(char* str, int start, int end) //将字符串从start到end这一段逆序

   {

    int i, j;

    char tmp;

   

    for (i = start, j = end; i < j; i++, j--)

    {

     tmp = str[i];

     str[i] = str[j];

     str[j] = tmp;

    }

   }

   

   void leftRound(char* src, int time)

   {

    int len = strlen(src);

    int pos = time % len;

    reverse_part(src, 0, pos - 1); //逆序前段

    reverse_part(src, pos, len - 1); //逆序后段

    reverse_part(src, 0, len - 1); //整体逆序

    printf("%s\n", src);

   }

   int main()

   {

    int a = 0;

    scanf("%d", &a);

    char arr[] = "abcdef";

    leftRound(arr, 2);

    return 0;

   }

相关文章
|
8天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
8天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
17天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
1月前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
23 4
|
1月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
1月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
1月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
1月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)