c语言:轻松实现左旋字符串

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

ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

这道题的解题方法有三种,废话不多说,首先来看第一种方法。

方法1

思路:ABCD左旋一个字符得到BCDA为例,首先可以把A保存到一个变量当中,然后让A之后的字符挨个往前覆盖,B覆盖到A的位置,C覆盖到B的位置,D再覆盖到C的位置,最后把变量里边的A覆盖到D的位置,这样就完成了一次翻转,也就是左旋一个字符,那么左旋2个,3个,4个…n个也是同样的思路。
下面上图解可以让你更直观的get到解题思路
c语言:轻松实现左旋字符串_第1张图片

代码实现如下:

#include 
#include 
void leftRound(char* str,int k)
{
    int len = strlen(str);//len是字符串长度
    int time = k % len;//左旋4次相当于没有变,由此得出这个公式,减少无效左旋次数
    for (int i = 0; i < time; i++)
    {
        char emp = str[0];//把第一位字符存起来
        int j = 0;
        for (; j < len - 1; j++) //j 最多只能到下标为2的位置,这样str[j+1]才不会越界访问
        {
            str[j] = str[j + 1];
        }
        str[j] = emp;//把存好的字符放到最后一位
    }
}
int main()
{
    char str[] = "abcdef";
    leftRound(str, 1);
    printf("%s", str);
}

方法2

我称之为三段逆序法,思路如下:
假设要把abcdef这组字符串左旋2个字符,那么可以拆分成两组字符串abcdef,分别逆序这两组字符串,得到bafedc,再将这两组字符串整体逆序过来,就可以得到左旋2个字符后的字符串cdefab,这个想法是不是很新奇呀,没想到吧,嘿嘿!
那么直接上代码:

#include 
#include 
void ReverseRange(char* str, int start, int end)//逆序字符串函数
{
    int left = start;
    int right = end;
    while (left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        left++;
        right--;
    }
}
void leftRound(char* str, int k)
{
    int len = strlen(str);
    int time = k % len; 
    ReverseRange(str, 0, time - 1);//调用函数逆序第一组字符串
    ReverseRange(str, time, len - 1);//调用函数逆序第二组字符串
    ReverseRange(str, 0, len - 1);//调用函数逆序整组字符串
}
int main()
{
    char str[] = "abcdef";
    leftRound(str,5);
    printf("%s", str);
    return 0;
}

方法3

这个方法其实算得上是最简洁,快速的方式了,需要用到两个字符串函数,分别是字符串拷贝函数strcpy字符串拼接函数strncat,首先来认识一下这两个字符串函数吧。
strcpy:将一个字符串中的内容拷贝到另一个目标字符串中(会覆盖原字符串内容)

注意:

  • 原字符串(需要被拷贝的字符串)必须以\0结束。
  • 会将原字符串中的\0一同拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放原字符串。
  • 目标空间可以被修改。

strncat:将一个字符串中的内容拼接到另一个字符串后面(不会覆盖原字符串内容)

注意:

  • 原字符串必须以\0结束。
  • 字符串不能给自己拼接(’\0’被覆盖,无终止条件)
  • 目标空间必须足够大,以确保能存放原字符串。
  • 目标空间可以被修改。

代码如下:

void leftRound(char* str,int k)
{
	int len = strlen(str);
	int time = k % len;
	char emp[20] = { 0 };
	strcpy(emp, str + time);//拷贝的是str首字符地址+2之后的字符串,也就是cdef
	strncat(emp, str, time);//拼接str字符串里的2个字符,也就是前两个字符,ab
	strcpy(str, emp);//再把emp里面的字符拷贝到原字符串str当中
}
int main()
{
	char str[] = "abcdef";
	leftRound(str, 2);
	printf("%s", str);
	return 0;
}

嘿嘿,学会了吗?如果对你有帮助,别忘了给博主一个三连哟❤️

你可能感兴趣的:(c语言,开发语言,经验分享)