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

这篇具有很好参考价值的文章主要介绍了【每日挠头算法题(5)】重新格式化字符串|压缩字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、重新格式化字符串

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

思路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;
    }
};

二、字符串压缩

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

思路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.关于字符串的重新格式化,这道题比较好解决,可以使用双指针,还可以用模拟构造两个字符串空间来进行存储,直接就过了哈哈。文章来源地址https://www.toymoban.com/news/detail-480703.html

到了这里,关于【每日挠头算法题(5)】重新格式化字符串|压缩字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python入门篇】——Python基础语法(字符串格式化,表达式格式化和数据输入)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句,Python函数,Python的数据容器等。 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 目前通过%符号占位

    2024年02月05日
    浏览(58)
  • 「SQL面试题库」 No_75 重新格式化部门表

    「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。 1.1 活动流程 整理题目 :西红柿每天无论刮风下雨

    2024年02月06日
    浏览(44)
  • Python 的字符串格式化指南

    Python 中控制字符串格式通常有三种形式: % 占位符(格式化符) str.format() 函数 f-string 内嵌式 Python 最先开始格式化字符串是用 %,但它的致命缺点是支持的类型有限制,只支持 int,str,double 这三种类型,从而导致其他所有类型只能转换(强制转换)为这几个类型,还有如果

    2024年02月08日
    浏览(56)
  • 浅谈非栈上格式化字符串

    这里先浅分析修改返回地址的两种打法,分别是\\\"诸葛连弩\\\"和”四马分肥“ 本文例题 以陕西省赛easy_printf为主 简单看一看程序 需要先过一个判断然后进入vuln 进入后 有一个13次的循环 可以让我们操作 第一步 肯定要先leak出栈地址 程序基地址和libc基地址 第二步 修改ret地址

    2024年02月14日
    浏览(53)
  • Python字符串格式化 (%操作符)

    在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。在Python中内置有对字符串进行格式化的操作符是\\\"%\\\"。 模板 格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的

    2024年02月14日
    浏览(49)
  • 格式化字符串你都懂了吗

    今天跟大家聊聊字 符串的格式化 这部分内容。乍一听“ 格式化 ”这三个字,有的初学者可能会懵:难道这是要清空字符串的节奏? 其实不是的,恰恰相反,格式化字符串是为了让字符串变的更美观、更灵活。接下来就给大家详细介绍格式化字符串的概念以及具体用法。 格

    2024年02月04日
    浏览(53)
  • 【每日挠头算法(4)】字符串相加|字符串相乘

    点我直达~ 1.将两个字符串从右往左开始进行相加,使用一个变量 ans 表示进位,如果两个字符串的个位加法和大于10,那么让进位+1,个位和再%10,然后将结果存入到新的字符串 strRet 中 2.两个字符串的十位和十位继续相加,并且需要加上个位的进位 ans ,步骤同1 3.这样不断相

    2024年02月09日
    浏览(56)
  • Python 用户输入和字符串格式化指南

    Python 允许用户输入数据。这意味着我们可以向用户询问输入。在 Python 3.6 中,使用 input() 方法来获取用户输入。在 Python 2.7 中,使用 raw_input() 方法来获取用户输入。以下示例要求用户输入用户名,并在输入用户名后将其打印在屏幕上: Python 3.6: Python 2.7: 为了确保字符串按预

    2024年02月05日
    浏览(82)
  • 格式化字符串走过的坑 pwn109

    格式化字符串走过的坑 pwn109 今天做的一道题有一个坑我调试半天终于打通了,格式化字符串的坑,确实不少,东西也比较多容易忘记,怎么说呢,功夫在平时,经验少了 老规矩先看一下保护 Full RELRO意味着got不能修改也就是不能通过格式化字符串漏洞来改got表,但是nx保护关

    2024年04月08日
    浏览(62)
  • 【每日挠头算法题(1)】——旋转字符串|亲密字符串

    点我直达终点~ 前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false; 通过观察,可以发现每旋转一次,第一个字符就会出现在最后一个字符的位置处,其余字符均往前挪动一个位置。 所以我们首先将第一个字符保存,然后挪动其他字符,再将保存的

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包