字符串相机&&字符串压缩&&一维数组变二维数组

举报
芒果_Mango 发表于 2022/11/30 23:59:37 2022/11/30
【摘要】 然后判断是否压缩后的字符串变短了,如果没有,则返回原字符串class Solution {public: string compressString(string S) { string ans ; int count = 1;//count最初置为1,如果有字符,至少有一个字符 for(int i = 0;i<S.size();i++) ...

然后判断是否压缩后的字符串变短了,如果没有,则返回原字符串

class Solution {
public:
    string compressString(string S) {
       string ans ;
       int count = 1;//count最初置为1,如果有字符,至少有一个字符
       for(int i = 0;i<S.size();i++)
       {
           //这里不用保证i+1<S.size()
           //因为字符串是可以访问S[S.size()]位置的,这个位置是\0
           if(S[i] == S[i+1])
           {
               count++;
               continue;//继续下一轮字符判断
           }
           //走到这里,说明S[i]和下一个字符S[i+1]不相同了
           ans+=S[i];//字符
           ans+=to_string(count);//个数
           count = 1;//count重新置1
       }
       //若压缩后的字符串没有变短,则返回原先的字符串  
       return ans.size()<S.size()?ans:S;  
    }
};

415. 字符串相加

https://leetcode.cn/problems/add-strings/

image-20220610112915559


从字符串的尾部开始往前相加,然后把最后相加的结果逆置
当:其中一个字符串没有遍历结束 || 进位不为0 都需要继续处理

如: “99” + “1” ->相加的结果为:001 ->逆置:100

class Solution {
public:
    string addStrings(string num1, string num2) {
       int carry = 0;//进位信息, 0/1
       int n1 = num1.size()-1;
       int n2 = num2.size()-1;
       //从后往前相加 
       //如果有进位信息||其中一个字符串没有结束都继续加
        string ans ;
        while(carry || n1>=0 || n2>=0)
        {
            int sum = 0;//每一轮重新置0!!!
            if(n1>=0) //如果num1没有遍历结束就+,否则不处理
                sum +=  num1[n1--] - '0';
            if(n2>=0)//如果num2没有遍历结束就+,否则不处理
                sum += num2[n2--] - '0';
            sum += carry;
            //处理进位信息
            carry = sum>=10 ? 1 : 0;
            ans.push_back(sum%10 + '0');
        }
        reverse(ans.begin(),ans.end());//逆置字符串
        return ans;
    } 
};

2022. 将一维数组转变成二维数组

https://leetcode.cn/problems/convert-1d-array-into-2d-array/

image-20220610113026451


注意:如果一维数组的元素个数不为 m*n,那么就构造不出m*n的二维数组,直接返回空容器

方法1:直接遍历一维数组,双层循环,构造m*n的二维数组,定义一个变量index标志遍历到一维数组的哪个元素

class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        //构造成m行n列的二维数组
        //如果original数组的元素个数不为:n*m个,就构造不出m行n列的二维数组
         vector<vector<int>> vv;
        if(original.size() != m*n)
        {
            return vv;
        }
        size_t index =0;//标志遍历到original的哪个下标位置
        //m行n列
        for(int i = 0;i<m;i++)
        {
            vector<int> tmp;
            tmp.resize(n);//记得要为tmp开辟空间!!!
            for(int j = 0;j<n;j++)
            {
                tmp[j] = original[index++];
                //tmp.push_back(original[index++]);//不可以使用push_back,因为是在原来已经有空间的情况下,继续往后插入数据!
            }
            vv.push_back(tmp);
        }
        return vv;
    }
};

方法2:使用迭代器区间构造, 原生指针是迭代器,所以每次使用数组的n个元素作为一段迭代器区间构造

class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        //二维数组的每一行可以认为是一个一维数组
        vector<vector<int>> vv;
        if(original.size() != m*n)
        {
            return vv;
        }
        //要构造m行n列的二维数组 -> 每一行有n个元素
        //每次从original中获取n个元素的首尾迭代器,构造一个临时vector插入到vv
        //然后迭代器往后走n步,来到下一个一维数组的起始位置
        for(auto it = original.begin();it != original.end();it+=n)
        {
            vector<int> tmp{it,it+n};//[it,it+n)共n个元素
            vv.push_back(tmp);//将构造好的一维数组插入到二维数组当中
        }
        return vv;
    }
};

方法2优化版本:使用C++11的新成员函数emplace_back

class Solution {
public:
      //使用c++11中的vector的成员函数:emplace_back
        //该函数功能:emplace_back函数的作用是减少对象拷贝和构造次数,是C++11中的新特性,主要适用于对临时对象的赋值
        //在使用push_back函数往容器中增加新元素时,必须要有一个该对象的实例才行,而emplace_back可以不用,它可以直接传入对象的构造函数参数直接进行构造,减少一次拷贝和赋值操作
    /*
    vector<info> v;
    v.push_back(info("nginx"));//在push_back之前,必须使用info实例一个临时对象传入才行,实例对象就必须要执行构造函数,然后拷贝到容器中再执行一次拷贝构造函数
    v.emplace_back("redis")//emplace_back可以不用执行多余的拷贝构造函数了,它是直接在容器内执行对象的构造
    */
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        vector<vector<int>> vv;
        if(original.size() != m*n)
        {
            return vv;
        }
        for(auto it = original.begin();it != original.end();it+=n)
        {
            //每次从original中获取n个元素的首尾迭代器,利用emplace_back函数插入到vv中
            vv.emplace_back(it,it+n);
        }
        return vv;
    }
};

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。