爱旋不旋--旋转字符串

简介: 字符串左旋实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB

文章目录


旋转字符串

字符串左旋

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

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB


题前认知:

一个字符串如果就定死了。eg:char arr[]=“dfdf”什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服)

所以字符串得是我们可输入的,才有可玩性,玩的不尽性就循环


暴力移位:

#include<stdio.h>
#include<string.h>
char* turn_left(char* arr, int num)
{
  int len = strlen(arr);
  int i = 0;
  //左旋数是多少就进行几次移位
  for (i = 0; i < num; i++)
  {
    //每次移位就是单次左旋
    int j = 0;
    char tmp = arr[0];//每次都把首元素存起来
    for (j = 0; j < len-1; j++)
    {     
      arr[j] = arr[j + 1];      
    }
    arr[len-1] = tmp;//把存起来的首元素放到最后一位
  }
  return arr;
}
int main()
{
  char arr[100] = {0};
  int num = 0;
  while (1)
  {
    printf("请输入想要旋转的字符串:>");
    gets(arr);
    printf("请输入想要左旋数:>");
    scanf("%d", &num);
    getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
    //下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
    printf("左旋字符串为:%s\n", turn_left(arr, num));
  }
  return 0;
}


输出结果

image.png


三步翻转:

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* head, char* tail) //字符串逆序
{
  assert(head && tail);//断言阻止空指针
  char tmp = 0;
  char* ptmp = &tmp;
  while (head<tail)
  {
    tmp = *head;
    *head = *tail;
    *tail = tmp;
    head++;
    tail--;
  }
  return 0;
}
char* turn_left(char* arr, int num)
{
  assert(arr);
  int len = strlen(arr);
  if (len)
  {
    int n = num % len;           //防止num会越界操作,所以必须是num模len才可,还要保证len不为0
    reverse(arr, &arr[n - 1]);          //逆序左边
    reverse(&arr[n], &arr[len - 1]);  //逆序右边
    reverse(arr, &arr[len - 1]);      //逆序整体
    return arr;
  }
  else
  {
    return arr;
  }
}
int main()
{
  char arr[100] = {0};
  int num = 0;
  while (1)
  {
    printf("请输入想要旋转的字符串:>");
    gets(arr);
    printf("请输入想要左旋数:>");
    scanf("%d", &num);
    getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
    //下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
    printf("左旋字符串为:%s\n", turn_left(arr, num));
  }
  return 0;
}

image.png

image.png

还有3种方法但那三种就需要很强的数学功底了,具体的我也看不懂他怎么证明的数学公式,就不看了。哈哈哈


判断字符串旋转

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

题前认知

大家现在应该知道我干啥,没错我倡导交互,两个字符串都是我们写**

字符串追加判断==(面试的时候能用库函数就用库函数)==

什么叫字符串追加判断呢 例如asdfg这个字符串

image.png

#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* str1, char* str2)
{ 
  assert(str1 && str2);
  int len1 = strlen(str1);
  int len2 = strlen(str2);
  //长度不同就肯定不是旋转字符串
  if (len1 - len2)
    return 0;
  //在arr1字符串中追加一个自己
  strncat(str1, str1, len1);
  //判断判断的那个字符串是不是追加字符串的子串
  char* ret = strstr(str1, str2);
  if (ret == NULL)
    return 0;
  else
    return 1;
}
int main()
{
  char arr1[50] = {0};//有足够的空间
  char arr2[50] = {0};
  while (1)
  {
    printf("请输入字符串:>");
    gets(arr1);
    printf("请输入需判断的旋转字符串:>");
    gets(arr2);
    int ret = is_left_move(arr1, arr2);
    if (ret == 1)
    {
      printf("是旋转字符串\n");
    }
    else
    {
      printf("不是旋转字符串\n");
    }
  } 
  return 0;
}


结果

image.png


目录
相关文章
|
2月前
|
前端开发
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
189 24
|
2月前
|
人工智能 自然语言处理 搜索推荐
传统产品经理思维在AI时代‘失灵’,能力图谱如何助力AI产品经理构建认知框架?
本文AI产品专家三桥君探讨了AI产品经理在技术快速发展背景下如何通过构建AI能力图谱来指导智能产品设计。三桥君从知识与推理、自然语言处理、交互能力和辅助决策四个维度系统梳理AI核心能力,帮助产品经理理解技术边界与应用场景。能力图谱不仅是技术地图,更是方法论工具,能够有效指导从需求分析到产品落地的全流程,包括发现问题、设计闭环系统和规划产品路径。掌握这一框架将帮助AI产品经理突破技术认知局限,打造真正智能化的产品解决方案。
114 0
|
7月前
|
人工智能
RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)
RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)
184 1
|
8月前
|
存储 安全 数据管理
解锁企业数据管理统一身份认证难题,EasyMR助力企业敏捷提效
在数字经济时代,企业面临数据量爆炸式增长的挑战。据IDC预测,2025年全球数据总量将超175 ZB。大数据成为决策关键,但传统管理模式已难以应对。袋鼠云推出的EasyManager平台专注于大数据集群全生命周期管理,提供从集群创建到智能监控的一站式解决方案,帮助企业高效处理海量数据,降低运营成本,提升业务敏捷性。同时,结合Kerberos、OpenLDAP和SSSD,EasyManager实现了统一身份认证与管理,确保企业在数据洪流中保持竞争力与安全性。
|
10月前
|
边缘计算 物联网 开发者
2024年提升开发效率的十大技巧
2024年,软件开发领域持续快速发展,新技术和工具层出不穷。本文总结了十大提升开发效率的技巧,包括精通Git Hooks自动化流程、利用Docker容器化技术、拥抱无代码/低代码平台、集成AI/ML、关注IoT、重视网络安全、采用云原生开发和微服务架构、探索边缘计算、利用AR和即时应用技术,以及参与开源软件项目。这些技巧旨在帮助开发者适应技术变革,提高工作效率。
|
11月前
|
设计模式 Java Spring
Spring Boot监听器的底层实现原理
Spring Boot监听器的底层实现原理主要基于观察者模式(也称为发布-订阅模式),这是设计模式中用于实现对象之间一对多依赖的一种常见方式。在Spring Boot中,监听器的实现依赖于Spring框架提供的事件监听机制。
248 1
|
11月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
数据可视化 安全 测试技术
部署流水线原则与工具设计
部署流水线原则与工具设计
169 1
|
JavaScript
element-ui中下拉command传递多参数事件封装
element-ui中下拉command传递多参数事件封装
633 0
element-ui中下拉command传递多参数事件封装
|
IDE 测试技术 开发工具
测试了5款最常见的模拟器,发现与Airtest自动化最配的竟然是...
测试了5款最常见的模拟器,发现与Airtest自动化最配的竟然是...
1014 0