《剑指offer》--字符串左旋

简介: 《剑指offer》--字符串左旋

字符串左旋的三种方法


1. 一个一个字符挪

代码实现如下:

#include <stdio.h>
#include <string.h>
void Left_Reverse(char* str,int k)
{
  int len = strlen(str);//6
  int time = 0;
  time = k % len;//真正要旋转的次数
  int i = 0;
  for (i = 0; i < time; i++)
  {
    int j = 0;
    char tmp = str[0];
    for (j = 0; j < len - 1; j++)
    {
      str[j] = str[j + 1];
    }
    str[j] = tmp;
  }
}
int main()
{
  char str[30] = "abcdef";
  int k = 3;//要旋转几个字符
  Left_Reverse(str,k);
  printf("%s\n", str);
  return 0;
}

画图说明:

这是循环执行一次的过程。上述代码中还要注意的是time=k%len.例如当k=7时,我们要旋转7次,但是当旋转第6次时字符串变回原样了,这就相当于还需旋转一次即可,k%len=1。

2. 库函数—strcpy和strncat

代码实现如下:

#include <stdio.h>
#include <string.h>
int main()
{
  char str[30] = "abcdef";
  int k = 2;
  int len = strlen(str);
  int time = k % len;
  char tmp[256] = { 0 };
  //把cdef拷贝进tmp数组中
  strcpy(tmp, str + time);
  //把str中的前两个字符追加到tmp中,此时tmp中是cdefab
  strncat(tmp, str, time);
  //最后把tmp拷贝回str中
  strcpy(str, tmp);
  printf("%s\n", str);
  return 0;
}

画图演示:

这种方法是比较简便的,我们要了解strcpy和strncat函数的使用。

3. 三段逆置法

代码实现如下:

#include <stdio.h>
#include <string.h>
//实现字符串左右端字符的交换
void Reverse(char* str, int left, int right)
{
  while (left < right)
  {
    char tmp =str[left];
    str[left] = str[right];
    str[right] = tmp;
    left++;
    right--;
  }
}
void Left_Round(char* str, int k)
{
  int len = strlen(str);
  int time = k % len;
    //三段逆置
  Reverse(str, 0,time - 1);
  Reverse(str, time,len-1);
  Reverse(str, 0,len - 1);
}
int main()
{
  char str[30] = "abcdef";
  int k = 3;
  Left_Round(str, k);
  printf("%s\n", str);
  return 0;
}

画图演示:

这里我们需要注意,我们定义的left和right是下标,在Reverse函数中我们也是对str的下标进行操作。

目录
相关文章
|
7月前
|
算法
OJ刷题:《剑指offer》之左旋字符串!
OJ刷题:《剑指offer》之左旋字符串!
|
7月前
|
Java
每日一题《剑指offer》数组篇之数组中的逆序对
每日一题《剑指offer》数组篇之数组中的逆序对
43 0
每日一题《剑指offer》数组篇之数组中的逆序对
【剑指offer】-二叉搜索树的后序遍历序列-23/67
【剑指offer】-二叉搜索树的后序遍历序列-23/67
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
|
C++
剑指offer 53. 数组中的逆序对
剑指offer 53. 数组中的逆序对
83 0
剑指offer 53. 数组中的逆序对
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
|
C++
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
70 0
剑指offer 34. 二叉搜索树的后序遍历序列
剑指offer 34. 二叉搜索树的后序遍历序列
57 0
|
算法
【算法】剑指offer-杨氏数组&&旋转数组
剑指offer-杨氏数组&&旋转数组
105 0