字符串左旋

简介: 字符串左旋

描述


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


       例如:ABCD左旋一个字符得到BCDA


                  ABCD左旋两个字符得到CDAB


方法一:设a=k%strlen(str),str为字符串变量,k为旋转次数,将str首元素开始a个元素后的每个元素向前移动一再将已存起的首元素放置str尾部,如此进行a次。

5bca675fd1e74280adc1b6b50b05d566.png


#include <stdio.h>
#include<string.h>
#include <assert.h>
//左旋
void LeftRotate(char* str, int len, int num)
{
  assert(str);
  assert(len);
  assert(num);
    num%=len;
  while (num) 
    {
    char temp = str[0];
    int i = 0;
    for (; i < len-1; i++)
    {
      str[i] = str[i + 1];
    }
    str[i] = temp;
    num--;
  }
}
int main()
{
  char str[] = "abcd1234";
  int len = strlen(str);
  int num = 0;
  printf("请输入左旋的次数:");
  scanf("%d", &num);
  printf("before: %s\n", str);
  LeftRotate(str, len, num);
  printf("after : %s\n", str);
  return 0;
}


方法二:设a=k%strlen(str),str为字符串变量,k为旋转次数,将str首元素开始a个元素为一组(左组),剩余元素为一组(右组),将左组进行逆序排列,再将组进行逆序排列,最后再整体逆序排列。  

e1d757390933414d9961866c9e5c27c8.png


#include<stdio.h>
#include<string.h>
void LeftRotate(char*a,int num)
{
  int len = strlen(a);
  //左逆序
  reverse(a,a+num-1);
  //右逆序
  reverse(a+num,a+len-1);
  //整体逆序
  reverse(a, a + len - 1);
}
int main()
{
  char a[] = "abcdef";
  int num=0;
  scanf("%d", &num);
  int len = strlen(a);
  num %= len;
  LeftRotate(a,num);
  printf("%s", a);
  return 0;
}

9dd17643289647deb906b475d7795e75.png


void reverse(char* left,char*right)
{
  while (left < right)
  {
    char temp = *left;
    *left = *right;
    *right = temp;
    right--;
    left++;
  }
}


目录
相关文章
|
7月前
|
机器学习/深度学习 测试技术 Windows
【动态规划】【回文】【字符串】1147. 段式回文
【动态规划】【回文】【字符串】1147. 段式回文
|
7月前
|
测试技术 Perl
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
|
5月前
|
API
用栈翻转字符串
用栈翻转字符串
38 0
|
6月前
《剑指offer》--字符串左旋
《剑指offer》--字符串左旋
35 0
|
7月前
|
C++
将有序数组转换为二叉搜索树(C++)
将有序数组转换为二叉搜索树(C++)
37 1
字符串左旋
字符串左旋
35 0
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串
每日三题 二叉树的层序遍历 二叉树的中序遍历 最小覆盖子串
106 1
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串

热门文章

最新文章