OJ刷题:《剑指offer》之左旋字符串!

简介: OJ刷题:《剑指offer》之左旋字符串!

1.题目描述


描述


汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列  S ,请你把其循环左移 K 位后的序列输出。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc”


数据范围:输入的字符串长度满足 0 \le len \le 100 \0≤len≤100  , 0 \le n \le 100 \0≤n≤100


进阶:空间复杂度 O(n)\O(n) ,时间复杂度 O(n)\O(n)


示例1


输入:

"abcXYZdef",3


复制返回值:

"XYZdefabc"

复制


示例2


输入:

"aab",10


复制返回值:

"aba"


https://www.nowcoder.com/share/jump/1889476041706625158356 题目链接放这里啦~


2.方法一(元素一一挪)


2.1算法解析


由上图我们可以发现左移6次和左移1次后的结果相同,所以我们可以用n%len来表示字符串左移的元素个数,那我们该怎么左移呢~


下面我用图像来表示核心算法~


2.2代码实现


下面是在牛客上解题的完整代码~

char* LeftRotateString(char* str, int n) 
{
    if(str==NULL)
  return NULL;
  int len=strlen(str);
  if(len==0)
  return str;
  int time=n%len;
  if(time==0)
  return str;//不用处理,返回原数组即可
  for (int i = 0; i < time; i++)
{
  int tmp = str[0];
  int j = 0;
  for (; j < len - 1; j++)
  {
    str[j] = str[j + 1];
  }
  str[j] = tmp;
}
return str;
}


3.方法二(三次逆置)


3.1算法解析


废话不多说,直接上图啦~


怎么样,算法是不是很简单呢~


3.2代码实现

void Reverse(char str[], int start,int end)
{
  while (start < end)
  {
    int tmp = str[start];
    str[start] = str[end];
    str[end] = tmp;
    start++;
    end --;
  }
}//部分逆置函数
char* LeftRotateString(char* str, int n) 
{
    int len=strlen(str);
  if(len==0)//没有这个判断,编不过去
  return str;
  int k=n%len;
  Reverse(str,0,k-1);
  Reverse(str,k,len-1);
  Reverse(str,0,len-1);
  return str;
}


4.方法三(库方法)


4.1算法解析


再讲具体算法前,这里要先介绍俩个库函数(strcpy,strcat)

. strcpy


. strcat


下面就是这种算法的图解啦~


4.2代码实现

char* LeftRotateString(char* str, int n) 
{
    if(NULL==str)
    return NULL;
    int size=strlen(str);
    if(size==0)
        return str;//这里换成NULL就不能通过
    int k=n%size;
    char*tmp=(char*)malloc(sizeof(char)*2*size);//动态内存开辟俩倍空间
    strcpy(tmp,str);
    //我们下意识的这里也同样使用strcpy但是这会存在问题。
    //因为strcpy会拷贝‘\0’,导致输出的函数可能缺少一部分,而strcat会覆盖‘\0’。
    strcat(tmp,str);
    tmp[k+size]='\0';
    return tmp+k;
}
相关文章
|
存储 测试技术 API
魔搭Agent体验升级!支持编辑已发布的Agent、新增tool说明书等
魔搭Agent作为开源版GPTs,可以零代码DIY一个具备丰富功能的chat bot,今天上线了一个新版本优化了相关体验,来看!
|
并行计算 算法 C++
统一内存统一内存的基本概念和使用
统一内存统一内存的基本概念和使用
2437 0
统一内存统一内存的基本概念和使用
|
JavaScript 前端开发
判断对象是否含有改属性,三个方法
JavaScript中判断对象是否包含属性的三种方法:1. 使用`'property' in object`检查自有属性和继承属性;2. 使用`object.hasOwnProperty('property')`仅检查自有属性;3. 使用`if (object.property)`判断,但返回属性值。
195 2
判断对象是否含有改属性,三个方法
|
人工智能 数据可视化 大数据
《MaxFrame 产品评测:探索数据处理新边界》
MaxFrame是一款新兴的分布式计算框架,旨在为大数据和AI应用提供强大支持。本文通过实际操作和深入分析,全面评测MaxFrame在环境搭建、基础功能、分布式处理、AI集成等方面的表现。其优点包括易用性、强大的分布式计算能力和与主流AI框架的良好集成,但也存在社区支持薄弱、功能细节待完善等不足。未来,MaxFrame有望通过加强社区建设、优化功能和集成可视化工具,进一步提升竞争力,成为大数据和AI领域的重要工具。
228 12
|
负载均衡 安全 网络安全
|
人工智能 自然语言处理 安全
主动式智能导购AI助手构建方案测评
主动式智能导购AI助手构建方案测评
227 12
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何对多个表进行历史数据的回刷(即补数据)
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
341 1
|
人工智能 算法
人工智能浪潮中的伦理困境:我们如何确保技术的道德发展?
【10月更文挑战第22天】在人工智能(AI)技术的迅猛发展中,伴随着巨大的潜力和便利性,也出现了众多伦理问题。从数据隐私到算法偏见,再到自动化带来的失业问题,AI的每一步进步都在考验着人类社会的道德底线。本文将探讨AI技术发展中的主要伦理问题,并讨论如何通过制定标准、教育和跨学科合作来确保AI技术的道德发展。
dpkg: 错误: 另外一个进程已经为 dpkg frontend lock 加锁
dpkg: 错误: 另外一个进程已经为 dpkg frontend lock 加锁
929 0
|
存储 算法 安全
JVM从入门到入土之详解G1垃圾回收器
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger
738 0