字符串左旋

简介: 字符串左旋

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


7b7fde021b069b8ed7dc507542db8c2a_ef7705b7c8364e3191070fc4d05d1448.png


代码实现如下


#include<stdio.h>
#include<string.h>
void left_revolve(char ch[], int k)
{
  int len = strlen(ch);
  k %= len;
  int i = 0;
  //4.根据k值,重复123操作
  for (i = 0; i < k; i++)
  {
  //1.创建临时变量存储首字符
  char tmp = ch[0];
  int j = 0;
  //2.字符串整体向前移动一个字符的大小
  for (j = 0; j < len - 1; j++)
  {
    ch[j] = ch[j + 1];
  }
  //3.将首字符存放到字符串末尾
  ch[len - 1] = tmp;
  }
}
int main()
{
  char ch[] = "abcdef";
  int k = 0;
  printf("请输入需要旋转字符的个数>");
  scanf("%d", &k);
  left_revolve(ch, k);
  printf("%s\n", ch);
  return 0;
}


37371f7a03c3909f2ac1ff98d6a0205d_ca9815e8ca1c4705ad9bff0a0b0fb4ab.png


既然可以将前k个字符左旋之后置于字符串末尾,那么也可以得到->
先将前k个字符倒序,再将剩余字符倒叙,最后再将前后两部分倒序

a6bfd28466a75050f2074017f387471f_b3fc4ac5034f4fbf96d21b96daad0080.png

代码实现如下


#include<stdio.h>
#include<assert.h>
#include<string.h>
void reverse(char* left, char* right)
{
  assert(left && right);
  while (left < right)
  {
  char tmp = *right;
  *right = *left;
  *left = tmp;
  left++;
  right--;
  }
}
void left_revolve(char ch[], int k)
{
  int len = strlen(ch);
  k %= len;
  //1.先逆序前k个字符
  reverse(ch, ch + k - 1);
  //2.再逆序剩余的字符
  reverse(ch + k, ch + len - 1);
  //3.最后逆序整个字符串
  reverse(ch, ch + len - 1);
}
int main()
{
  char ch[] = "abcdef";
  int k = 0;
  printf("请输入需要旋转字符的个数>");
  scanf("%d", &k);
  left_revolve(ch, k);
  printf("%s\n", ch);
  return 0;
}

dd677be9635a6e0606d95a96537dea35_825ac477432c4b2582f619940c6f91fc.png


目录
相关文章
|
7月前
《剑指offer》--字符串左旋
《剑指offer》--字符串左旋
40 0
字符串左旋
字符串左旋
69 0
字符串左旋
|
8月前
L1-050 倒数第N个字符串
L1-050 倒数第N个字符串
33 0
|
算法 测试技术 计算机视觉
详解链表oJ<反转链表,链表的中间节点及链表的回文>
详解链表oJ<反转链表,链表的中间节点及链表的回文>
53 0
【Leetcode -234.回文链表 -160.相交链表】
【Leetcode -234.回文链表 -160.相交链表】
27 0
逆置字符串
逆置字符串
66 0
|
测试技术
字符串转二叉树
字符串转二叉树
118 0
字符串转二叉树
求旋转数组(左旋和右旋)的常用两个方法(详解)
求旋转数组(左旋和右旋)的常用两个方法(详解)
200 0
求旋转数组(左旋和右旋)的常用两个方法(详解)
|
算法 前端开发 API
字符串看到 ”回文“ 尝试双指针
字符串看到 ”回文“ 尝试双指针
68 0