代码随想录算法训练营第七天|LeetCode 334.反转字符串、541反转字符串II、151反转字符串中的单词

news2024/9/20 22:29:17

一、LeetCode 334.反转字符串

题目链接:. - 力扣(LeetCode)

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

 题目思路:

        与反转链表相同,依旧采用的是双指针的方法,只不过相对于链表,字符串的反转更为简单一点,因为字符串是数组,所以元素在内存中是连续分布的,这就决定了两者反转的差异。

        定义两个指针,分别指向字符串的首端和末尾端,然后交换两个指针所指的内容,然后两个指针靠近,直到两个指针的位置重叠即退出。

void reverseString(char* s, int sSize) {
     int left=0;//左指针
     int right=sSize-1;//右指针
     while(left<right)//两个指针位置不重叠就交换
     {
        char c=s[left];
        s[left++]=s[right];
        s[right--]=c;
     }
}

二、LeetCode 541.反转字符串II

题目描述:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

题目思路: 

与上题的做法基本一致,只不过加了一些限定条件,看似有三个限制条件,其实在书写代码的时候,只需要判断其剩余字符是不是大于K,如果大于做法都是一样的,因为不管剩余字符剩余多少都不会进行翻转。如果小于,急需要调整一下翻转的范围。

char* reverseStr(char* s, int k) {
    int len=strlen(s);//取出整体长度
    for(int i=0;i<len;i+=(2*k))//判断翻转还能不能进行
    {
        k=i+k>len?len-i:k;//判断剩余的长度,决定右指针的位置
        int left=i;
        int right=i+k-1;
        while(left<right)//两两交换
        {
           char c=s[left];
           s[left++]=s[right];
           s[right--]=c;
        }
    }
    return s;
}

三、LeetCode 151.反转字符串的单词

题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

题目思路:

        本题相对于前面两个题目稍微复杂一点,但是本质是一样的,具体做法是,首先我们要先将字符串中多余的空格进行去除,哪些呢?首端的空格,尾端的空格,以及字符串中两个单词的连续空格,采用什么样的的做法呢?采用双指针(快慢指针的方式),然后将所有的字符串进行反转,然后将对应单词进行翻转。 

void remov_k(char* s)//去除空格函数
{
  int start=0;
  int end=strlen(s)-1;
  while(s[start]==' ')//去除前端空格
    start++;
  while(s[end]==' ')//去除后端空格
    end--;
    int slow=0;
    for(int i=start;i<=end;i++)//利用快慢指针去除内部空格
    {
        if(s[i]==' ' && s[i+1]==' ')
        {
            continue;
        }
        s[slow]=s[i];
        slow++;
    }
    s[slow]='\0';
}

void reverse(char *s,int start,int end)//字符串反转,这个函数可以长字符串反转,也可短字符串进行反转
{
   int i=start;
   int j=end;
    while(i<j)
    {
        int tmp=s[i];
        s[i++]=s[j];
        s[j--]=tmp;
    }
}

char* reverseWords(char* s) {
    remov_k(s);
    reverse(s,0,strlen(s)-1);
    int slow=0;
    for(int i=0;i<=strlen(s);i++)
    {
        if(s[i]==' '|| s[i]=='\0')
        {
            reverse(s,slow,i-1);
            slow=i+1;
        }
    }
return s;
}

 四、KamaCoder 55.优选字符串

题目链接:55. 右旋字符串(第八期模拟笔试)

题目描述:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

题目思路:与上面的题目一致,先进行大部分字符的反转,在进行局部的反转。

 

#include <stdio.h>
#include <string.h>

void reverse(char* s,int left,int right)//子符串交换函数
{
    while(left<right)
    {
        char c=s[left];
        s[left++]=s[right];
        s[right--]=c;
    }
}    
    void rightRotate(char *s,int k)
    {
        int len=strlen(s);
        reverse( s,0,len-1);   
        reverse( s,0,k-1); 
        reverse( s,k,len-1); 
    }
    int main()
    {
        int k;
        scanf("%d",&k);
        char s[10000];
        scanf("%s",s);
       rightRotate(s,k);
       printf("%s\n",s);
        
    }
    

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万字长文浅谈三高系统建设方法论和实践

1 概述 整个软件的发展历程是一部软件复杂性对抗史&#xff0c;软件的复杂性分为技术复杂性和业务复杂性&#xff0c;业务复杂性主要是建模和抽象设计&#xff0c;技术复杂性主要是三高&#xff08;高性能&#xff0c;高并发&#xff0c;高可用&#xff09;的应对&#xff0c;…

高中生护眼台灯哪个牌子好?五款性价比高的护眼台灯测评结果

现在市面上形形色色的打着“护眼”口号的台灯太多了&#xff0c;因为眼睛对于我们来说很重要&#xff0c;我们看到美丽的事物都因为有他&#xff0c;所以大家一听到护眼就会选择购买。很多商家为了赚钱&#xff0c;随便贴个标签就说护眼&#xff0c;其实一点用都没有。高中生护…

九源基因第二大客户是供应商:国内分销商减少250家,押注减肥药

《港湾商业观察》廖紫雯 日前&#xff0c;杭州九源基因工程股份有限公司&#xff08;以下简称&#xff1a;九源基因&#xff09;二闯港交所&#xff0c;保荐机构为华泰国际、中信证券。此前&#xff0c;公司曾于1月向港交所提交过上市申请&#xff0c;但后续未有相关进展。 招…

Vue Element Plus el-select 使用 filterable 搜索下 @blur 事件绑定失效

失效原因 使用 filterable 导致 blur 事件绑定在输入框上&#xff0c;而不是整个选择器上 当点击选项时&#xff0c;输入框失去焦点触发 blur 事件 而点击其她位置收起下拉款的时候&#xff0c;并不会触发输入款的 blur 事件 解决方案 使用 element 提供的 visible-change …

【嵌入式学习笔记】---- 时钟源时钟树 RCC

微观引入时钟源 在芯片内部&#xff0c;布满了各种逻辑电路&#xff0c;通过数字信号进行通信 假设芯片内部存在如下这种逻辑电路&#xff1a; ①状态&#xff1a;当A、B均输入1时&#xff0c;与门输出1&#xff0c;异或门输出0&#xff0c;故此时寄存器的值为0 ②状态&…

文件被误删?找回电脑删除的文件,这4招很好用

在日常使用电脑的过程中&#xff0c;不小心误删重要文件的情况时有发生&#xff0c;让人心急如焚。但别担心&#xff0c;只要掌握了一些实用的方法&#xff0c;你就有可能轻松找回那些看似已经消失的文件。今天&#xff0c;就为大家分享四招非常有效的找回电脑删除文件的方法&a…

Java笔试面试题AI答之正则表达式(2)

文章目录 7. 简述Java正则表达式零宽断言 &#xff1f;8. 简述Java正则表达式贪婪与懒惰 &#xff1f;贪婪匹配&#xff08;Greedy Matching&#xff09;懒惰匹配&#xff08;Lazy Matching&#xff09;区别与应用示例 9. 简述Java正则表达式POSIX 字符类&#xff08;仅 US-ASC…

docker安装prometheus、grafana监控SpringBoot

1. 概述 最新有一个需求&#xff0c; 需要安装一个监控软件&#xff0c;对SpringBoot程序进行监控&#xff0c; 包括机器上cpu, 内存&#xff0c;jvm以及一些日志的统计。 这里需要介绍两款软件&#xff1a; prometheus 和 grafana prometheus: 中文名称&#xff0c; 普罗米…

OpenCV 与 Matplotlib 的结合使用:探索有趣的图像处理与可视化功能

本文将讲述&#xff0c;将 OpenCV 与 Matplotlib 相结合&#xff0c;可以充分利用两者的优势&#xff0c;实现丰富多彩的图像处理和数据可视化功能。本文将介绍几种有趣且实用的结合应用&#xff0c;并通过示例代码展示具体实现方式。在今后的博客中会扩展下面的十个基础实现以…

宝贝甜梦秘籍!康姿百德柔压磁性枕豪华款守护成长每一夜

科学护航童年梦&#xff01;康姿百德豪华柔压磁性枕&#xff0c;给孩子五星级的睡眠享受 孩子的成长过程中&#xff0c;良好的睡眠环境至关重要。而康姿百德柔压磁性枕&#xff08;豪华款&#xff09;&#xff0c;凭借其独特的设计和材料&#xff0c;成为了孩子成长过程中不可…

乐凡三防平板高性能为稳定运行保驾护航

随着科技进步的浪潮&#xff0c;三防工业平板电脑在自动化生产、设备监控及数据收集等场景中日益彰显其关键作用。但在特定环境&#xff0c;比如户外探险、紧急救援或电力供应不稳定的场合&#xff0c;维持设备的持续运行成为了一大挑战。因此&#xff0c;开发一款配备可更换电…

运动耳机怎么选购?解密最值得购买的五大品牌!

​到了2024年&#xff0c;开放式耳机已经成为耳机界的大热门。它们的好处是&#xff0c;既能让你听得健康&#xff0c;戴着又舒服&#xff0c;还能一边听歌一边留意周围的声音&#xff0c;这对于喜欢户外活动的人来说&#xff0c;能提高安全意识&#xff0c;是个很好的优势。作…

GaussDB关键技术原理:高弹性(三)

书接上文GaussDB关键技术原理&#xff1a;高弹性&#xff08;二&#xff09;从优化器剪枝、执行器两方面对hashbucket进行了解读&#xff0c;本篇将从段页式技术方面继续介绍GaussDB高弹性技术。 3 段页式 3.1 段页式存储 根据前文的介绍&#xff0c;hashbucket需要对文…

数据库审计是什么?主要用在哪些场景呢?

数据库审计是什么&#xff1f;主要用在哪些场景呢&#xff1f; 数据库审计 数据库审计是指对数据库系统中的操作进行记录、监控和分析的过程&#xff0c;用于检查和评估数据库的安全性、合规性和完整性。数据库审计可以为组织提供重要的安全保障和合规性需求的满足。本文将介…

嵌入式24千兆电口+4万兆光口管理型三层交换机RTL9301模块

核心模块概述: 嵌入式RTL9301模块可以支持4口万兆上联24口千兆三层管理型以太网交换机&#xff0c;也就是最多可以提供24个10/100/1000自适应电口、4个10 Gb SFP 端口、1个console口、1个USB串口。 完善的安全控制策略及CPU保护策略(CPU protect policy)提高容错能力&#xff0…

LLM大模型学习:LLM常见问题(思维链部分)

1. 什么是思维链提示&#xff1f; 思维链(Chain-of-thought&#xff0c;CoT)&#xff0c;指的是一系列有逻辑关系的思考步骤&#xff0c;形成一个完整的思考过程。人在日常生活中&#xff0c;随时随地都会用思维链来解决问题&#xff0c;比如工作、读书经常用到的思维导图&…

【git】git安装方法

1 Git 的下载 这个就需要去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com或者gitforwindows.org&#xff0c;或者阿里镜像&#xff08;感谢评论区的星悸迷航同学&#xff09; 上面的 git-scm 是 Git 的官方&#xff0c;里面有不同系统不同平台的安装包和…

Nhanes数据(复杂调查数据)绘制限制立方样条(rcs)函数svyggrcs1.8尝鲜版发布

临床上&#xff0c;因变量和临床的结局有时候不是线性关系&#xff0c;而回归模型有一个重要的假设就是自变量和因变量呈线性关联&#xff0c;因此非线性关系模型用回归分析来拟合受到限制。因此&#xff0c;一个更好的解决方法是拟合自变量与因变量之间的非线性关系&#xff0…

智慧公厕:城市公共卫生管理的新篇章‌@卓振思众

在快节奏的现代生活中&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;其使用体验和管理效率直接影响着市民的生活质量与城市形象。随着科技的飞速发展&#xff0c;智慧公厕应运而生&#xff0c;它以一种全新的姿态&#xff0c;为城市公共卫生管理带来了前所未…

【吊打面试官系列-Redis面试题】Pipeline 有什么好处,为什么要用 pipeline?

大家好&#xff0c;我是锋哥。今天分享关于 【Pipeline 有什么好处&#xff0c;为什么要用 pipeline&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Pipeline 有什么好处&#xff0c;为什么要用 pipeline&#xff1f; 1000道 互联网大厂Java工程师 精选面试题…