ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

蓝桥杯练习008

2021-12-15 22:03:19  阅读:168  来源: 互联网

标签:count 字符 string 练习 蓝桥 startIndex 字符串 008 cur


蓝桥杯练习008

面试题 01.06. 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:“aabcccccaaa”
输出:“a2b1c5a3”

示例2:

输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。

提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/compress-string-lcci

解题思路

传递的参数为要压缩的字符串,可以将字符串的第一个字符先存到cur变量中,并用一个count变量存放当前字符出现的次数,初始化为1次,然后从字符串的第二个位置开始遍历字符串,进行判断。

如果当前的字符cur和字符串的某一个位置上的字符相等,就让count的值加一,如果不相等,就把当前的字符和count的值拼接到字符串变量中,用来保存结果,需要注意的是需要将int类型的变量count用to_string方法转换为字符串类型。

还有需要注意的是:当走到最后的位置时,由于后边没有和最后一个字符进行比较,因此需要在循环结束后把最后那一部分加到结果中。
转换完后,需要对输出进行控制,判断转换后的长度是否小于之前的长度,如果小于,就输出转换后的字符串,否则输出转换之前的字符串。

代码

class Solution {
public:
    string compressString(string S) {
        string ans = "";//保存结果
        char cur = S[0];//用来标记当前字符
        int count = 1;//当前字符的数量
        for (int i = 1; i < S.length(); i++) {//对字符串进行遍历
            if (cur != S[i]) {//当前字符和下一个字符不相等
                ans += cur + to_string(count);//将当前字符和数量保存到结果
                cur = S[i];//将当前字符换成下一个字符
                count = 1;//数量重置为1
            }
            else count++;//当前字符和下一字符相等,数量加一
        }
        ans += cur + to_string(count);//处理最后的一部分
        return ans.length() < S.length() ? ans : S;//按照题目要求返回字符串较短的那一个
    }
};

剑指Offer38.字符串的排列

题目要求

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制:

1 <= s 的长度 <= 8

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof

解题思路

代码

class Solution {
public:
    vector<string> ret;//存放结果
    vector<string> permutation(string s) {
        f(s, 0);//从第一个开始找
        return ret;
    }
    //递归求解全排列
    void f(string& s, int startIndex) {
        //退出机制
        if (startIndex == s.length()) {//当到最后时将结果存到ret中
            ret.push_back(s);
            return;
        }
        //从startIndex开始向后遍历
        for (int i = startIndex; i < s.length(); i++) {
            //加一个判断,当之前的首字和现在一样的情况下直接返回
            bool isContinue = true;//标记
            for (int j = startIndex; j < i; j++) {
                if (s[j] == s[i]) {//如果之前出现过就不用交换位置
                    isContinue = false;
                }
            }
            if (!isContinue) continue;//之前出现过这个字母,就不需要交换位置
            swap(s[startIndex], s[i]);//将当前字母和后边字母交换位置求全排列
            f(s, startIndex + 1);//找下一个
            swap(s[startIndex], s[i]);//将之前交换的字母再交换回来
        }
    }
};

标签:count,字符,string,练习,蓝桥,startIndex,字符串,008,cur
来源: https://blog.csdn.net/qq_51302626/article/details/121962817

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有