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
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
1813 1
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
人工智能 供应链 算法
创新场景丨从数字化到智能化,中远海科“航运新基建”探路
随着数据治理和 AI 大模型应用深入,船视宝日趋完善,开始发挥航运业数智新底座的作用,距离中远海科的愿景也更近一步。
|
数据采集 缓存 机器人
《API网关在智能制造产线协同中的定制化实践与可靠性重构》
本文聚焦API网关在汽车焊装车间的定制化实践,针对工业协议多样、车间环境抗干扰差、脉冲式流量等痛点,选型APISIX构建“设备接入层+指令转发层”双层架构。通过自研工业协议适配插件、智能数据清洗单元解决协议适配与抗干扰问题;设计生产场景动态优先级调度与分布式削峰池应对流量波动;以“本地缓存+断点续传+指令确认”保障数据可靠,植入生产场景标签实现故障精准溯源。改造后设备数据延迟缩至200ms内,指令成功率达99.7%,产线效率提升15%,为智能制造场景下API网关实践提供可靠路径。
455 8
|
数据采集 监控 API
加密货币 Pump 监测刮刀工具开发原理及实现路径
开发Pump监测刮刀工具需综合运用高频数据采集、波动率建模、跨平台对冲三大核心技术,2025年的技术瓶颈已从基础数据获取转向超低延迟执行与合规适配。建议采用模块化开发策略,优先实现核心监控功能,再逐步接入AI决策与链上套利模块。代码示例需根据最新交易所API文档动态调整,并严格遵守所在地监管法规。
|
人工智能 Linux C++
即开即用,封装 Flask 项目为 exe 文件实操步骤
即开即用,封装 Flask 项目为 exe 文件实操步骤
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
925 2
|
机器学习/深度学习 人工智能 缓存
GPU加速和CPU有什么不同
【10月更文挑战第20天】GPU加速和CPU有什么不同
1131 1
|
自然语言处理 IDE 测试技术
通义灵码怎么样?分为哪些版本,看看基础能力多少分?
通义灵码是一款基于通义大模型的智能编码辅助工具,提供实时代码续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释等功能。

热门文章

最新文章