【每日挠头算法题(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;
    }
};

二、字符串压缩

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

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

<think>好的,我需要帮助用户寻找名为“hbiuder”的格式化插件的相关信息,包括使用说明和下载方法。首先,我会检查提供的三个引用内容,看看是否有提到这个插件。引用[1]提到了PeachHtmlTemplate的下载和解压步骤,引用[2]是关于HTML列表的示例,引用[3]涉及极光推送的链接和插件配置。这三个引用都没有直接提到“hbiuder”插件。 接下来,我应该考虑用户可能拼写错误,比如“hbiuder”是否正确。常见的情况可能是“htmlbeautifier”或者类似名称的格式化工具。不过用户明确提到“hbiuder”,所以需要确认是否存在这个插件。 由于现有的引用中没有相关信息,我需要建议用户进行更广泛的搜索。首先推荐检查官方文档或开发者社区,如GitHub、npm等平台。同时,提示用户检查拼写,并尝试在搜索引擎中使用特定关键词,比如加上“插件”或“格式化工具”等后缀。另外,技术论坛和问答网站也可能有相关讨论。 最后,如果用户无法找到,可以建议替代方案,例如常用的代码格式化工具如Prettier,并说明它们的安装和使用方法。这样即使用户找不到“hbiuder”,也能有其他解决方案。同时,提醒用户下载插件时注意来源的安全性,避免恶意软件。</think>根据现有信息,关于“hbiuder 格式化插件”的直接描述未在提供的引用内容中体现[^1][^2][^3]。以下是可能的解决路径: --- ### **步骤1:确认插件名称准确性** - 检查是否拼写错误,例如可能是 **`htmlbeautifier`**(HTML代码格式化工具)的误写。常见插件如: - **Prettier**(通用代码格式化工具) - **JS-Beautify**(支持HTML/CSS/JS格式化) --- ### **步骤2:搜索官方渠道** 1. **访问开发者平台或仓库** 尝试在以下平台搜索: - **GitHub**:`https://github.com/search?q=hbiuder` - **npm 仓库**:`https://www.npmjs.com/search?q=hbiuder` - **VS Code Marketplace**(若为编辑器插件) 2. **关键词优化** 使用组合关键词,例如:`hbiuder 插件 下载` 或 `hbiuder formatter documentation` --- ### **步骤3:检查现有引用中的关联线索** - 引用提到了极光推送插件的下载与配置流程,但未涉及格式化工具。 - 若插件与HTML模板相关,可参考引用[^1]中“解压模板到项目目录”的通用方法。 --- ### **步骤4:替代方案推荐** 若无法找到该插件,建议使用成熟的格式化工具: ```bash # 通过npm安装Prettier(需Node.js环境) npm install --save-dev prettier # 格式化所有HTML文件 npx prettier --write "**/*.html" ``` --- ### **注意事项** - 下载插件时,优先选择官方网站或可信源(如引用中提到的“可靠来源”) - 警惕第三方平台未经验证的插件,可能存在安全风险 ---
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓富民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值