【每日挠头算法题(5)】重新格式化字符串|压缩字符串

欢迎~

  • 一、重新格式化字符串
    • 思路1:构造模拟
      • 具体代码如下:
    • 思路2:双指针法
      • 具体代码如下:
  • 二、字符串压缩
    • 思路1:简单替换
  • 总结


一、重新格式化字符串

点我直达~
在这里插入图片描述

思路1:构造模拟

  • 1.遍历字符串,将数字字符和字母字符分别放在不同的字符串
  • 2.如果|字母字符数量 - 数字字符数量| > 1 ,则无法实现格式化,返回""
  • 3.如果不是2.中的情况,则偶数为字符必须放数量多的字符串对应的字符(下标从0开始)。
  • 将数量多的字符串对应的字符和数量少的字符串对应的字符交叉逐个放回到原字符串即可。

具体代码如下:

class Solution {
public:
    string reformat(string s) 
    {
        string letter,num;
        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >= 'a' && s[i] <='z')
                letter+=s[i];
            else
                num+=s[i];
        }
        

        int lenl = letter.size();
        int lenn = num.size();

        //字母个数和数字个数的差值大于1,不管怎么排,都一定有连续的类型出现
        if(abs(lenl - lenn) > 1 )
            return "";

        int i = 0,numi = 0,letteri = 0;
        while(i < s.size())            
        {
            if(letter.size() > num.size())
            {
                s[i++] = letter[letteri++];
                s[i++] = num[numi++];
            }
            else
            {
                s[i++] = num[numi++];
                s[i++] = letter[letteri++];
            }
        }
        return s;
    }
};

时间复杂度O(n),空间复杂度O(n)


思路2:双指针法

  • 1.遍历字符串,将数字字符和字母字符分别放在不同的字符串
  • 2.如果|字母字符数量 - 数字字符数量| > 1 ,则无法实现格式化,返回""
  • 3.字符数量多的字符串有优先权,偶数位必须放字符数量多的字符,(下标从0开始),下标分别记为i = 0,j = 1
  • 4.遍历s,如果s[i]不是数量多的字符,则从j开始往后遍历,知道找到第一个是数量多的字符,与s[i]叫交换
  • 5.依次往后遍历,直到 i到末尾结束。

具体代码如下:

    string reformat(string s) 
    {
        // //法2:双指针
        
        // //1.遍历字符串,计算数字和字符分别有多少
        int lend = 0,lena = 0;
        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >='0' && s[i]<='9')
                ++lend;
        }
        lena = s.size() - lend;

        //字母个数和数字个数的差值大于1,不管怎么排,都一定有连续的类型出现
        if(abs(lend-lena) > 1)
            return "";

        //字符多的要放在第一位
        bool flag = lend > lena;

        for(int i = 0,j = 1;i<s.size();i+=2)
        {
            //如果偶数位不是放数量多的,那就要从奇数位开始找这个数量多的字符
            //下标从0开始
            if(isdigit(s[i]) != flag)
            {
                while(j<s.size())
                {
                    if(isdigit(s[j]) == flag)
                    {
                        swap(s[i],s[j]);
                        break;
                    }

                    j+=2;
                }
            }
        }
        return s;
    }
};

二、字符串压缩

点我直达~
在这里插入图片描述

思路1:简单替换

  • 1.开辟一块同S大小的空间,遍历S字符串,如果S[i] !=S[i+1]或者i == S.size() -1,说明下标遇到了某一个相同子串的终点或者遇到字符串末尾,此时将对应的子串的字符和长度追加到开辟好的字符串s中。
  • 2.如果新开辟的字符串长度大于原来的字符串,则压缩失败,返回原来的字符串。
  • 3.否则返回新的字符串

具体代码如下:

//写了这道题才发现有一个函数叫做to_string(),将任意一个东西转成字符串
//
class Solution {
public:
    string compressString(string S)
    {
        string s;
        int len = 0;
        for (int read = 0; read < S.size(); ++read)
        {
            ++len;
            if (S[read] != S[read + 1] || read == S.size() - 1)
            {
                s +=S[read];
                s += (to_string(len));
                len = 0;
            }

        }
	
	return S.size() > s.size()? s:S ; 
	
    }
};

时间复杂度O(n),空间复杂度O(n)

总结

  • 1.今天写得两道字符串的题目,其中一道题目是关于字符串的压缩的,对于这道题,刚开始绞尽脑汁都不知道如何原地覆盖原字符串,后来发现好像也不用这样原地覆盖,第二个出现的问题是,如果某个字符出现的次数大于10次该怎么处理。在这里我已经被之前写过的一道类似的压缩字符串的题目给洗脑了,用了短除法存储,再逆置,但是我不会啊。。后面发现之前写的题是将字符的长度放在顺序表中的,而这道题是直接用string构造的,可以调用operator+=,终于解决了这道题。

  • 2.关于字符串的重新格式化,这道题比较好解决,可以使用双指针,还可以用模拟构造两个字符串空间来进行存储,直接就过了哈哈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-6-12-第三式单例模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

HTTPS

HTTP 协议内容都是按照文本的方式明文传输的。 这就导致在传输过程中出现一些被篡改的情况。为了保证安全&#xff0c;现在大多数网站都采用HTTPS协议。HTTPS协议是在HTTP协议的基础上引入了一个加密层SSL。 目录 HTTPS的加密流程对称加密非对称加密为什么引入非对称加密&…

Python处理办公自动化的10大场景

在编程世界里&#xff0c;Python已经是名副其实的网红了。Python最大优势在于容易学&#xff0c;门槛比Java、C低非常多&#xff0c;给非程序员群体提供了用代码干活的可能性。当然Python能成为大众编程工具&#xff0c;不紧是因为易学&#xff0c;还因为Python有成千上万的工具…

抖音电商发展路径:从外链种草到达人/品牌直播

复盘抖音电商发展&#xff0c;可以总结出以下几点发展特征&#xff1a; 策略重心的变化 以种草为核心&#xff0c;给电商引流站外成交&#xff08;2019 年及之前&#xff09;→ 力推达人直播但效 果一般&#xff08;2020 上半年&#xff09;→ 推品牌自播并彻底闭环&#xff0…

Redis.conf 详解

我们启动 Redis&#xff0c;一般都是通过 Redis.conf 启动。 因此&#xff0c;我们必须了解 Redis.conf 的配置&#xff0c;才能更好理解和使用 Redis。 单位 单位注意事项&#xff1a;当需要内存大小时&#xff0c;可以指定为1k 5GB 4M等 通常形式&#xff1a; 1k > 1000字…

谈谈几个常见数据结构的原理

数组 数组是最常用的数据结构&#xff0c;创建数组必须要内存中一块 连续 的空间&#xff0c;并且数组中必须存放 相同 的数据类型。比如我们创建一个长度为10&#xff0c;数据类型为整型的数组&#xff0c;在内存中的地址是从1000开始&#xff0c;那么它在内存中的存储格式如…

【lvs集群】HAProxy搭建Web集群

HAProxy搭建Web集群 一、 HAProxy简介1.1HAProxy主要特性1.2HAProxy负载均衡策略非常多&#xff0c;常见的有如下8种1.3LVS、Nginx、HAproxy的区别1.4常见的Web集群调度器 二、Haproxy搭建 Web 群集haproxy服务器部署节点服务器部署 三、定义监控页面与定义日志3.1定义监控页面…

Multimodal fusion via cortical network inspired losses(第一次优质论文分享)

Multimodal fusion via cortical network inspired losses 论文介绍1. 论文研究的任务是什么&#xff1f;2. 论文关注/拟解决的问题是什么&#xff1f;3. 论文提出什么方法如何解决这个问题&#xff1f;4. 如何设计实验 来证明 所提方法确实解决了 拟解决的问题&#xff1f; 论…

kotlin协程flow retry功能函数返回失败后重试(4)

kotlin协程flow retry功能函数返回失败后重试&#xff08;4&#xff09; import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var count 0 //重试计数runBlocking {load().onEach…

RetinaNet网络介绍

前言 上一篇博文我们介绍了Focal Loss&#xff0c;原理也比较简单&#xff0c;有不了解的小伙伴可以先跳转到之前的博文了解一下。Focal Loss介绍。这篇博文我们来看下Focal Loss的出处&#xff1a;Focal Loss for Dense Object Detection&#xff0c;这篇论文提出了RetainNet之…

chatgpt赋能python:Python怎么建服务器?

Python怎么建服务器&#xff1f; 作为一名具有10年Python编程经验的工程师&#xff0c;我深入研究了Python的一些高级特性&#xff0c;其中包括Python如何建立服务器的方法。Python是一个高级的编程语言&#xff0c;可以轻松创建服务器应用程序&#xff0c;并为您的网站提供高…

低秩矩阵(Low-Rank)的意义

&#xff11;&#xff0e;回顾基础&#xff1a; 矩阵的秩度量的是矩阵行列之间的相关性&#xff0c;如果各行各列都是线性无关的&#xff0c;矩阵就是满秩。非零元素的行或列决定了秩的大小。&#xff0f;&#xff0f;划重点&#xff0c;秩可以度量矩阵自身相关性 讲个小故事…

windows 服务程序和桌面程序集成(七)效果演示及源程序下载

系列文章目录链接 windows 服务程序和桌面程序集成&#xff08;一&#xff09;概念介绍windows 服务程序和桌面程序集成&#xff08;二&#xff09;服务程序windows 服务程序和桌面程序集成&#xff08;三&#xff09;UDP监控工具windows 服务程序和桌面程序集成&#xff08;四…

计算机提示“找不到vcruntime140.dll,无法继续执行代码可”以这样子修复

首先&#xff0c;对于那些不熟悉的人来说&#xff0c;vcruntime140.dll是一个关键文件&#xff0c;用于在Windows操作系统上运行使用C语言编写的大型应用程序。如果你正在运行或安装这样的应用程序&#xff0c;但找不到vcruntime140.dll文件&#xff0c;那么你的应用程序可能无…

Maven私服

Maven 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 建立了 Maven 私服后&#xff0c;当局域网内的用户需要某个构件时&#xff0c;会按照如下顺序进行请求…

低代码崛起:会让程序员饭碗不保,人工智能或成其催化剂

人工智能技术目前发展的趋势如何 关于人工智能技术的评价&#xff0c;大众的评价几乎算是较为一致的&#xff0c;都认为其已成为人类有史以来最具革命性的技术之一。当然了&#xff0c;可能目前的我们还是很难想象机器自主决策所产生的影响&#xff0c;但可以肯定的是&#xff…

ELF文件结构和实战分析

文章目录 示例编译运行 ELF文件格式ELF HeaderELF Section Header Table (节头表)sh_typesh_flagssh_link、sh_info 节链接信息 ELF Sections节的分类.text节.rodata节.plt节&#xff08;过程链接表&#xff09;.data节.bss节.got.plt节&#xff08;全局偏移表-过程链接表&…

ArkTS语言HarmonyOS/OpenHarmony应用开发-message事件刷新卡片内容

开发过程 在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility&#xff0c;然后由FormExtensionAbility刷新卡片内容。 common&#xff1a;公共文件 通过点击button按钮&#xff0c;刷新卡片内容。代码示例&#xff1a; WidgetCard.ets let stor…

内网渗透—Linux上线

内网渗透—Linux上线 1. 前言2. 下载插件3. CS配置3.1. 客户端配置3.1.1. 导入插件文件3.1.2. 配置监听 3.2. 服务端配置3.2.1. 导入配置文件 3.3. 生成木马3.3.1. 修改cna文件3.3.2. 修改后效果 3.4. 执行木马 1. 前言 默认情况下CS是不支持上线Linux的&#xff0c;只支持上线…

learn C++ NO.6——类和对象(4)

1.再谈构造函数 1.1.构造函数体赋值 在创建类的对象时&#xff0c;编译器回去调用类的构造函数&#xff0c;来各个成员变量一个合适的值。 class Date { public:Date(int year,int month,int day){_year year;_month month;_day day;}private:int _year;int _month;int _…